2016-07-14 15 views
0

Ich versuche bmp zu ico Konverter zu machen. Ich habe ein Problem mit GetParent/GetAncestor Funktion. Hier sind einige Fragmente meines Codes:winapi C++ GetAncestor/GetParent

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    HWND hWndAbout; 
    switch (message) 
     { 
      /* ... */ 

      hWndAbout = CreateDialog(hInst, MAKEINTRESOURCE(KONWERTER_DIALOG_ABOUT), hwnd, AboutDlgProc); 
      ShowWindow(hWndAbout, SW_SHOW); 

     } 
} 

Dies war ein Teil von wo aus der jurney beginnt mit dem anderen Teil:

BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
    case WM_CREATE: 
    break; 
    case WM_PAINT: 
     HWND hwndParent; 
     HDC hDCParent; 
     hwndParent = GetAncestor(hDlg, GA_PARENT); //hwndParent = GetParent(hDlg); //hwndParent = GetRealParent(hDlg); 
     hDCParent = GetDC(hwndParent); 
     hDC1 = GetDC(hDlg); 
     if (g_Checked1)StretchBlt(hDC1, 0, 0, 16, 16, hDCParent, 0, 0, 600, 600, SRCCOPY); 
     if (g_Checked2)StretchBlt(hDC1, 0, 0, 32, 32, hDCParent, 0, 0, 600, 600, SRCCOPY); 
     if (g_Checked3)StretchBlt(hDC1, 0, 0, 64, 64, hDCParent, 0, 0, 600, 600, SRCCOPY); 
     create_icon(hDlg); 
     ReleaseDC(hDlg, hDC1); 
     ReleaseDC(hwndParent, hDCParent); 
    break; 

    /* ... */ 
    } 
} 

ich hwndParent die hwnd Handler sein wollen, aber es wird ein Handler zum Desktop.

Was ist los?

How I visualize my idea?

Wie Sie meinen StreachBlt zieht Teil des Desktop sehen können, nicht mein schönes Gesicht. Ich habe bereits versucht, GetParent, die das gleiche Ergebnis ergab. Danke für die Hilfe.

+0

Versuchen Sie es mit 'GetParent() 'anstelle von' GetAncestor() '. –

+0

Wie Sie sehen können, habe ich bereits versucht: hwndParent = GetAncestor (hDlg, GA_PARENT); // hwndParent = GetParent (hDlg); // hwndParent = GetRealParent (hDlg); – piotrus1444

+2

Um den Dialog zu malen, benötigen Sie das Fensterhandle des Dialoges, nicht den Dialog Eltern oder Besitzer. Und die korrekte Handhabung von "WM_PAINT" beinhaltet mindestens den Aufruf von "BeginPaint" und "EndPaint". Es sei denn, Sie leiten Code weiter, der das tut. –

Antwort

0

Vielen Dank für Ihre Hilfe. Einige Ratschläge haben mir geholfen, mein Problem zu verstehen. Ich beschloss, es von Create() zu CreateDialogParam Wechsel() und ich bestanden die Eltern Handler lParam Parameter:

hWndAbout = CreateDialogParam(hInst, MAKEINTRESOURCE(KONWERTER_DIALOG_ABOUT), hwnd, AboutDlgProc, (LPARAM)hwnd); 
       ShowWindow(hWndAbout, SW_SHOW); 

und in der Kinder Fenster habe ich WM_INITDIALOG den Handler erhalten:

case WM_INITDIALOG: 
    hwndParent = (HWND)lParam; 
break;