winapi c++ GetAncestor/GetParent

winapi c++ GetAncestor/GetParent

本文关键字:GetParent GetAncestor c++ winapi      更新时间:2023-10-16

我尝试将bmp转换为ico转换器。我对GetParent/GetAncestor功能有问题。以下是我的代码的一些片段:

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);
       }
}

这是从朱尔尼开始到另一部分的一部分:

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;
    /* ... */
    }
}

我想hwndParent成为hwnd处理程序,但它变成了桌面处理程序。

怎么了?

如何想象我的想法?

正如你所看到的,我的StreachBlt画了桌面的一部分,而不是我可爱的脸。我已经尝试使用给出相同结果的GetParent。谢谢你的帮助。

谢谢你的帮助。一些建议帮助我了解我的问题。我通过将 CreateDialog() 更改为 CreateDialogParam() 来解决它,并使用 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;