NTK and The NTK Project
are properties of Jn Dechereux
Home | Documentation | FAQ.

Vanilla 1.1.8 is a product of Lussumo. More Information: Documentation, Community Support.

Welcome Guest!
Want to take part in these discussions? If you have an account, sign in now.
If you don't have an account, apply for one now.
    •  
      CommentAuthorohaldi
    • CommentTimeMay 2nd 2017
     
    Hello,
    I'm trying to write a simple about windows.
    I don't understand why my picture is not displayed in this hWndAbout window?
    If I use the hDC main window it work.
    Line who call this function:

    ...
    DECLARE TOOLBAR MEMBER INTO aTbBtnList ;
    ID ID_BTN_ABOUT ;
    CAPTION "" ;
    SUPER ACCEL KEY K_CTRL_V ACTION DoAboutW(hWnd) ;
    BITMAP UP "ABOUTUP" BITMAP OVER "ABOUTOVR" ;
    BITMAP DN "ABOUTDN" BITMAP GRAYED "ABOUTOFF" ;
    SHifT TO 0,0 ;
    BACKCOLOR NTK_RGB(100,100,100) ;
    MESSAGE "Info sur le programme"+CR+ ;
    "(Ctrl+I)"
    ...

    FUNCTION DoAboutW(hwnd, cDispMsg, hDC)
    Local hWndAbout
    Private hAbout := NTK_ReadPictureToBmp( "images/AboutOtto.jpg" )

    CREATE WINDOW hWndAbout ;
    TITLE "About" ;
    AT 0,0 SIZE 400,300 ;
    ON EXIT NTK_SendQuitEvent()

    @ 010,010 SAY BITMAP hAbout SIZE 220,280 INTO WINDOW hDC // Here it work, but is displayed on the main windows!
    @ 010,010 SAY BITMAP hAbout SIZE 220,280 INTO WINDOW hWndAbout // With hWndAbout do not work!


    ACTIVATE WINDOW hWndAbout CENTER // Display Main window and its controls

    InKey(3) // Only to stop for 3 sec. Test.

    NTK_DeleteObject(hWndAbout)
    CLOSE WINDOW hWndAbout
    Return(Nil)
    •  
      CommentAuthorccarrignon
    • CommentTimeMay 3rd 2017
     
    Bonjour Otto,

    Présentement vous avez choisi d'utiliser vos output commands en mode libre (pas de paintproc). A mon avis votre probleme vient tout simplement du fait que vous tentez d'afficher le bitmap avant même que le fenêtre hWndAbout soit activé et donc il ne se passe rien.

    Pour moi, au lieu de:
    @ 010,010 SAY BITMAP hAbout SIZE 220,280 INTO WINDOW hWndAbout // With hWndAbout do not work!
    ACTIVATE WINDOW hWndAbout CENTER // Display Main window and its controls

    vous devriez plutôt faire:
    ACTIVATE WINDOW hWndAbout CENTER // Display Main window and its controls
    @ 010,010 SAY BITMAP hAbout SIZE 220,280 INTO WINDOW hWndAbout

    Concernant votre output:
    @ 010,010 SAY BITMAP hAbout SIZE 220,280 INTO WINDOW hDC // Here it work, but is displayed on the main windows!

    Il s'affiche dans le main parceque normalement cette syntaxe est faite pour fonctionner en mode automatique
    dans une func paintproc(), dans laquelle tous les outputs sont rassemblés, et qui fournie systématiquement un handle de device context (hDC) valid via le 5ème parametre. i.e.
    Function DoRepaint(hWnd, nMsg, nwparam, nlparam, hDc)
    @ 010,010 SAY BITMAP hAbout SIZE 220,280 INTO WINDOW hDC
    @ ....... SAY .... PICT......
    @ ...BOX.....
    Return(0)

    Dans votre cas, vous utilisez cette syntaxe en dehors d'une paintproc, et, comme je ne vois aucune instruction du genre hDC := NTK_GetDC(hWndAbout) j'en déduis que votre var hDC est probablement déclarée à NIL, 0, ou toute autre valeur numérique .... (sinon ça planterait).
    En bref, vous specifiez un context (hDC) qui n'existe pas. Donc, NTK l'interprète comme un basic command
    [@ 10,10 SAY BITMAP hABout] et affiche le bitmap dans la fenetre actuellement active (par défaut), c'est à dire le Main.

    Voilà tout.

    -Chris
    •  
      CommentAuthorohaldi
    • CommentTimeMay 5th 2017
     
    Bonjour Chris,

    Encore un grand merci pour votre aide.
    >vous devriez plutôt faire:
    >ACTIVATE WINDOW hWndAbout CENTER // Display Main window and its controls
    >@ 010,010 SAY BITMAP hAbout SIZE 220,280 INTO WINDOW hWndAbout
    >
    En effet ceci était la solution. Je ne savais pas qu'il fallait activer le fenêtre avant.

    Question: Avec chaque fenêtre est-il plus logique de faire une fonction de RePaint automatique pour regrouper tout les outputs.
    Par exemple dans mon about je vais y ajouter quelques lignes de texte (say) et un boutons pour refermer la fenêtre.
    •  
      CommentAuthorccarrignon
    • CommentTimeMay 5th 2017
     
    Bonjour Otto,

    Je ne pense pas qu'il y ait de règle absolue.
    Pour ma part, dans les petites moulinettes ou programs de maintenance je ne me prends pas la tête:
    j'écris en graphique quasi comme en clipper-text. Et comme on est mono fenêtre y pas de risques.
    e.g.
    PROC MAIN()
    hWnd := NtkWinSetup( nil, "Maintenance CLIENT", 0,0,640,480 )
    NTK_CenterWindow( hWnd )
    
    SET PIXEL OFF
    SET ROW RATIO TO 20
    SET COL RATIO TO 8
    
    WAIT "Lancer la purge des soldes? (O/N)"
    cKey := CHR(NTK_LastKey()-500)
    IF  !(cKey $ "oO" .OR. NTK_LastKey()==K_ENTER)
       CLOSE WINDOW hWnd
       RETURN(Nil)
    ENDIF
    
    CLEAR
    ? "Traitement en cours..."
    NTK_HourGlass(.T.)
    USE CLIENT NEW
    DO WHILE !EOF()
       REPLACE CREDIT WITH 0, CREDSEUIL WITH 0, CREDDISP WITH 0, TOTALDU WITH 0
       @ 3,5 SAY "RAZ soldes de l'enregistrement N°"+Str(RecNo(),6)
       SKIP
    ENDDO
    CLOSE DATA
    NTK_HourGlass(.F.)
    
    ?
    ? "Traitement terminé."
    ? "Presser sur une touche pour fermer..."
    NtkInkey(0)
    
    CLOSE WINDOW hWnd
    RETURN
    

    Par contre, dans mes applics utilisateurs en multi-fenêtres, j'utilise toujours une paintproc, meme pour un simple About dialog. L'avantage de la paintproc c'est que vous ne vous occupez de rien. Tous vos outputs sont gérés et maintenus automatiquement par le GDI.
    - pas une ligne d'un code complexe pour maintenir l'affichage du main lorsque vous faites glisser la wnd About-Dialog (ou tout autre application) par dessus;
    - pas besoin de savescreen() le main avant l'affichage du About-Dialog, puis de restscreen() après
    sa fermeture;
    - De plus, si vous faites des @..SAY du contenu de variables dans la painproc (fiche client par ex) et que vous en changer les valeurs ailleurs dans votre programme, il vous suffira juste de faire un simple REFRESH SCREEN OF hMyWnd et tout l'écran sera à jour. Gros gain de prog!

    Voila. Bonne continuation à vous.

    -Chris

    P.S. Maintenant que je connais je truc pour mettre en forme le code source je ne m'en prive plus. :wink:
    •  
      CommentAuthorohaldi
    • CommentTimeMay 12th 2017
     
    Encore un grand merci pour tous ces renseignements.
    Mais je nage encore un peu avec les fenêtres NTK..
    Pourquoi mon @ 350,350 SAY "Test About.." INTO WINDOW hWndAbout s'affiche dans la fenètre hWnd (fenètre principal) et non dans hWndAbout ?
    cela fonctionne sans problème avec @ 010,010 SAY BITMAP pictAbout SIZE 220,280 INTO WINDOW hWndAbout.

    FUNCTION DoAboutW(hwnd, cDispMsg, hDC)
    Local hWndAbout,pictAbout

    pictAbout := NTK_ReadPictureToBmp( "images/AboutOtto.jpg" )

    CREATE WINDOW hWndAbout ;
    TITLE "About" ;
    AT 0,0 SIZE 600,400 ;
    ON EXIT NTK_SendQuitEvent()

    ACTIVATE WINDOW hWndAbout CENTER // Display Main window and its controls

    @ 010,010 SAY BITMAP pictAbout SIZE 220,280 INTO WINDOW hWndAbout // Image About
    @ 350,350 SAY "Test About.." INTO WINDOW hWndAbout

    NtkInkey(3)

    NTK_DeleteObject(pictAbout)
    CLOSE WINDOW hWndAbout

    Return(Nil)
    •  
      CommentAuthorccarrignon
    • CommentTimeMay 12th 2017 edited
     
    Bonjour Otto,

    Absolument aucune idée. A première vue ce code devrait fonctionner comme expecté.
    Perso, en env. multi-fenetres, j'utilise toujours une paintproc()comme ça jamais de surprise.
    essayez plutôt quelque chose du genre:
    FUNCTION DoAboutW(hwnd, cDispMsg)
    Local hWndAbout,pictAbout
    
    pictAbout := NTK_ReadPictureToBmp( "images/AboutOtto.jpg" )
    
    CREATE WINDOW hWndAbout ;
    TITLE "About" ;
    AT 0,0 SIZE 600,400 ;
    INTO PARENT hWnd;    // évite de créer des fenetres concurentes/séparées
    ON PAINT DoAboutwPaint();
    ON EXIT NTK_SendQuitEvent()  
    
    ACTIVATE WINDOW hWndAbout CENTER // Display Main window and its controls
    
    NtkInkey(3)
    
    NTK_DeleteObject(pictAbout)
    CLOSE WINDOW hWndAbout
    
    Return(Nil) 
    
    function DoAboutwPaint(hWnd, nMsg, nwParam, nlParam, hDC)
    @ 010,010 SAY BITMAP pictAbout SIZE 220,280 INTO CONTEXT hDC // Image About
    @ 350,350 SAY "Test About.." INTO CONTEXT hDC
    return(0)
    

    - Chris
    •  
      CommentAuthorohaldi
    • CommentTimeMay 12th 2017
     
    Votre variante fonctionne parfaitement.
    Juste du mettre la variable pictAbout en private.
    Merci