前面的博客有一篇专门写了《如何创建自己的ICON图标》,在讲对话框之前,先讲一下如何修改窗口左上角的小图标,这个跟exe的ICON图标有点不一样,不是直接在CreateWindow的倒数第三个参数=LoadIcon(NULL,MAKEINTRESOURCE(ICONID))就行了,这样只是对exe大图标有用,详细请看我的前面的博客。
其实32X32和16X16的ICON图标的ID是一样的。这两者的创建都是一样的,有什么疑问请看博客:菜单和其他资源(1)如何画自己的ICON图标。
这里创建了两个ICON图标,一个16X16的,一个是32X32的
32X32的这样加载:
wndclass.Icon=LoadIcon(NULL,MAKEINTRESOURCE(ICONID));
16X16的这样加载:
SendMessage(hwnd, WM_SETICON, (WPARAM)TRUE, (LPARAM)LoadIcon(GetModuleHandle(NULL), (LPCTSTR)ICONID));
//hWnd为窗口句柄
//TRUE表示用大图标
//GetModuleHandle(NULL)表示获得当前应用程序实例
//IDI_APP为当前程序资源中一个图标的ID
//如果提示找不到IDI_APP,请在该文件前几行添上一句#include "resource.h",这样才会把资源ID载入
看看效果吧:
ICON讲到这里,下面看看如何创建自己的对话框
模式对话框和无模式对话框:无模式对话框允许我们把输入焦点切换到同一个应用程序的另一个窗口,该对话框也无需关闭,这个比较普遍。可以用API函数CreateDialogParam创建。
模式对话框主要是两类:应用程序模式对话框和系统对话框。应用程序对话框不允许我们在本应用程序中切换输入焦点,但是可以切换到其他应用程序中去,比如点击记事本的文件打开按钮,会弹出选择打开文件的对话框,这个对话框不能切换到记事本中,但是可以切换到其他应用程序中去。这个就是属于应用程序模式对话框。系统对话框则比较恶毒,不允许你切换到任何一个应用程序中,我们一看名字就知道,系统对话框,看似比较紧急,要求我们必须首要解决····模式对话框可以用API函数DialogBoxParam产生。
现在讲的是最简单的,只是说明一下,如何创建的问题,后面的博客会有更复杂的对话框。
1新建一个win32项目,然后编写自己的代码;
2新建资源,创建自己的ICON和MENU
3新建资源,创建自己的对话框,在编辑对话框的时候,可也拖拽控件,just like C#(对话框里面拉一个picture,type改成Icon,Image改成ICONID)
对话框也可以添加菜单等等。。。
看看具体的代码:
#include<windows.h>
#include"resource.h"
BOOL CALLBACK DialogProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);//声明一个对话框过程函数
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
HINSTANCE hInst;
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)
{
static TCHAR szAppName[]=TEXT("leimingzi");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
//HWND hDlg;
HMENU hMenu;
hInst=hInstance;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=DLGWINDOWEXTRA;
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndclass.hIcon=LoadIcon(NULL,MAKEINTRESOURCE(ICONID));//exe大图标
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WindowProc;
wndclass.lpszClassName=szAppName;
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClass(&wndclass))//注册窗口
{
MessageBox(NULL,TEXT("the program require the window nt"),TEXT("tips"),MB_ICONERROR);
return 0;
}
hMenu=LoadMenu(hInstance,MAKEINTRESOURCE(MENUID));//加载菜单
hwnd=CreateWindow(
szAppName, // registered class name
TEXT("this is title"), // window name
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // horizontal position of window
CW_USEDEFAULT, // vertical position of window
CW_USEDEFAULT, // window width
CW_USEDEFAULT, // window height
NULL, // handle to parent or owner window
hMenu, // menu handle or child identifier
hInstance, // handle to application instance
NULL // window-creation data
);
//hDlg=CreateDialogParam(hInstance,MAKEINTRESOURCE(DIALOGID),hwnd,NULL,NULL);
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
static HINSTANCE hinstance;
static HWND hDlg;
static HICON hIcon;
switch(uMsg)
{
case WM_CREATE:
hinstance=((LPCREATESTRUCT)lParam)->hInstance;
SendMessage(hwnd, WM_SETICON, (WPARAM)TRUE, (LPARAM)LoadIcon(GetModuleHandle(NULL), (LPCTSTR)ICONID));//添加窗口小图标
return 0;
case WM_COMMAND:
switch(LOWORD(wParam))//菜单事件处理
{
case ID_HELP_HELP:
DialogBox(hinstance,MAKEINTRESOURCE(DIALOGID),hwnd,DialogProc);//弹出一个模态对话框
MessageBeep(0);//发出系统声音
break;
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
BOOL CALLBACK DialogProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_INITDIALOG://初始化对话框
return TRUE;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
EndDialog(hDlg,0);
return TRUE;
}
break;
}
return FALSE;
}
图标的创建:
效果图