对话框中显示图标的实现方法

在对话框中显示图标的实现方法:
第一种,这种方法是一种较为简单的实现方法,在设计对话框的样式的时候,利用图像控件生成一个矩形区域,点击属性按钮,在类型的那个地方选择图标,在图像的那栏中输入图标资源名称。当然这种情况下,不能够在标题栏处显示图标。即:


 
第二种情况,在对话框过程处理WM_INITDIALOG消息中,通过调用SetClassLong函数来设置图标。在这种情况下,图标出现在标题栏处。代码:


 
在这里就有一个问题了,如果在主窗口中创建的是动态图标的话,那么怎么让对话框中的图标显示与程序图标显示一致呢?
在这里我个人的解决方法是,生成一个计时器,让其与窗口过程函数的计时器的时间间隔一致,然后,在WM_TIMER消息中调用SetClassLong函数来实现对话框中的图标与窗口过程函数设置的图标相一致。具体的代码为:


 
好了,以上就是个人对于对话框图标显示的解决方法。

以下是这个程序的全部代码:(在这个程序中我加载了18个图标资源)

#include <windows.h>
#include <tchar.h>
#include "resource.h"

LRESULT CALLBACK WndProc(HWND hwnd , UINT message , WPARAM wparam , LPARAM lparam);
BOOL CALLBACK AboutDialogProc(HWND hwnd , UINT message , WPARAM wparam , LPARAM lparam);

int WINAPI WinMain(          
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
)
{
    MSG msg;
    HWND hwnd;
    WNDCLASS wndclass;
    TCHAR ClassName[] = _T("Dialog program !");
    TCHAR MenuName[] = _T("DialogMenu");

    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.hCursor = LoadCursor(NULL , IDC_ARROW);
    wndclass.hIcon = LoadIcon(hInstance , MAKEINTRESOURCE(IDI_ICON1));
    wndclass.hInstance = hInstance;
    wndclass.lpfnWndProc = WndProc;
    wndclass.lpszClassName = ClassName;
    wndclass.lpszMenuName = MenuName;
    wndclass.style = CS_HREDRAW | CS_VREDRAW;

    RegisterClass(&wndclass);

    hwnd = CreateWindow(ClassName , 
        ClassName , 
        WS_OVERLAPPEDWINDOW , 
        CW_USEDEFAULT , 
        CW_USEDEFAULT , 
        CW_USEDEFAULT , 
        CW_USEDEFAULT , 
        NULL , 
        NULL , 
        hInstance , 
        NULL);

    ShowWindow(hwnd , nCmdShow);
    UpdateWindow(hwnd);

    while(GetMessage(&msg , NULL , 0 , 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd , UINT message , WPARAM wparam , LPARAM lparam)
{
    static HINSTANCE hinstance;
    static int icon[] = {IDI_ICON2  , IDI_ICON3  , IDI_ICON4  , IDI_ICON5  , IDI_ICON6  , IDI_ICON7  , 
                         IDI_ICON8  , IDI_ICON9  , IDI_ICON10 , IDI_ICON11 , IDI_ICON12 , IDI_ICON13 , 
                         IDI_ICON14 , IDI_ICON15 , IDI_ICON16 , IDI_ICON17 , IDI_ICON18 , IDI_ICON19 };
    static int iconSelect;

    switch(message)
    {
    case WM_CREATE:
        hinstance = ((LPCREATESTRUCT)lparam)->hInstance;
        SetTimer(hwnd , 1 , 588 , NULL);
        break;

    case WM_TIMER:
        SetClassLong(hwnd , GCL_HICON , (LONG)LoadIcon( hinstance , MAKEINTRESOURCE( icon[iconSelect++ % 18] ) ) );
        break;

    case WM_COMMAND:
        DialogBoxParam(hinstance , MAKEINTRESOURCE(IDD_DIALOG) , hwnd , AboutDialogProc , 0);
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        break;

    default:
        return DefWindowProc(hwnd , message , wparam , lparam);
    }

    return 0;
}

BOOL CALLBACK AboutDialogProc(HWND hwnd , UINT message , WPARAM wparam , LPARAM lparam)
{
    switch(message)
    {
    case WM_INITDIALOG:
        SetClassLong(hwnd , GCL_HICON , (LONG)GetClassLong(GetParent(hwnd) , GCL_HICON));
        SetTimer(hwnd , 1 , 588 , NULL);
        return TRUE;

    case WM_TIMER:
        SetClassLong(hwnd , GCL_HICON , (LONG)GetClassLong(GetParent(hwnd) , GCL_HICON));
        return TRUE;

    case WM_COMMAND:
        switch(LOWORD(wparam))
        {
        case IDOK:
        case IDCANCEL:
            EndDialog(hwnd , 0);
            return TRUE;
        }
        return TRUE;
    }

    return FALSE;
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。