2016-07-14 5 views
0

私は、bmpからicoへ変換しようとしています。私はGetParent/GetAncestor機能に問題があります。ここに私のコードのいくつかの断片は、以下のとおりです。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); 

     } 
} 

これはjurneyは、他の部分に始まり、ここから一部であった:

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; 

    /* ... */ 
    } 
} 

私はhwndハンドラなりhwndParentにしたいが、それはハンドラになりデスクトップに転送します。

何が間違っていますか?

How I visualize my idea?

あなたは私のStreachBltは、デスクトップの一部ではなく、私の美しい顔を描く見ることができるように。私はすでに同じ結果を出したGetParentを使ってみました。ご協力ありがとうございます。

+0

使用してみてください 'GetParent関数を() 'GetAncestor()'の代わりに '' GetAncestor() ''の代わりに使用します。 –

+0

ご覧のとおり、私はすでに試してみました: hwndParent = GetAncestor(hDlg、GA_PARENT); // hwndParent = GetParent(hDlg); // hwndParent = GetRealParent(hDlg); – piotrus1444

+2

ダイアログをペイントするには、ダイアログの親または所有者ではなくダイアログのウィンドウハンドルが必要です。そして、 'WM_PAINT'の正しい取り扱いには、最小限の' BeginPaint'と 'EndPaint'を呼び出すことが必要です。それを行うコードに転送している場合を除きます。 –

答えて

0

ありがとうございました。いくつかのアドバイスは私の問題を理解するのに役立ちました。私はCreateDialogParamにcreateDialogをを()()を変更することによってそれを解決して、私はlParamにパラメータを使用して親ハンドラを渡さ:

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

と子ウィンドウに私は、ハンドラを取得WM_INITDIALOGを使用:

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