@[TOC关于VC++创建窗口及修饰浅谈
大二下,选修了一节多平台设计课,主要是采用WIN API和C语言开发Windows应用。
上星期老师布置了一次作业,内容如下:
1.图标: 注册类时使用自己画的大图标和小图标
2.菜单: 设计一个菜单,能控制动态改变图标(3选1单选),在四个位置显示文字信息(复选)
3.加速键: 每个菜单项都有加速键
4.消息框: 改变图标前确认是否真要修改
经过两天的琢磨(在CSDN上逛)最终才完成设计,为了避免遗忘和以后学习VC++设计的小伙伴,我想对某些函数做些简单的介绍,仔细看应该会有点收获,毕竟我也是从小白学起的,建议使用Microsoft Visual Studio编写。
关于图标
// 目的: 注册窗口类。
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32PROJECT3);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_ICON1));
return RegisterClassEx(&wcex);
}
其中hIcon指定一个和类相关的图标资源句柄,如果没有指定就用默认的。hIconSm指定一个和类相关的小的图标资源句柄。
1.如果你想使用系统自带的图标,就只需要使用
wcex.hIcon = LoadIcon (NULL, IDI_APPLICATION);
其中IDI_APPLICATION是系统自带的图标资源,还有一些其他的
IDI_APPLICATION
IDI_ASTERISK
IDI_EXCLAMATION
IDI_HAND
IDI_QUESTION
IDI_WINLOGO
2.如果是想用自己画的图标(.ico),这时需要两个都需要使用
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_ICON1));
其中IDI_ICON1是自己的图标的名字,自己的图标需要加进.rc文件中
3.如果是想通过选择更换图标,这时需要在你的case(选择)中加入一个函数,
SetClassLong (hWnd,GCL_HICONSM,(LONG)LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON2)));
其中IDI_ICON2是自己的图标的名字,自己的图标需要加进.rc文件中
这样就可以做到变换啦!
菜单
case IDM_SHIFT1:
if(CheckMenuItem(hMenu,wmId,MF_CHECKED)==MF_UNCHECKED){
hdc=GetDC(hWnd);
hello=TEXT("显示一");
TextOut(hdc,100,200,hello,lstrlen(hello));
ReleaseDC(hWnd,hdc);
}
else{
CheckMenuItem(hMenu,wmId,MF_UNCHECKED);
hdc=GetDC(hWnd);
hello=TEXT(" ");
TextOut(hdc,100,200,hello,lstrlen(hello));
ReleaseDC(hWnd,hdc);
}
break;
1.关于菜单的选项可以在.rc文件中(这时在Microsoft Visual Studio中打开,注意resouce.h文件和.rc文件不可同时打开)的Menu中直接添加。;
2.关于选项的复选,我想说的是需要调用CheckMenuItem函数对其返回值进行判断从而进行输出还是对之前得输出进行覆盖。
3.注意:CheckMenuItem函数时检查该选项是否被选择过;
然后hdc=GetDC(hWnd); ReleaseDC(hWnd,hdc);这两个尤其重要,前者GetDC函数为一个指定窗口的客户端区域或者整个屏幕从一个设备上下文(DC)中提取一个句柄;
后者是使用过后对其进行释放以便下次提取。
加速键
/
//
// Accelerator
//
IDC_WIN32PROJECT3 ACCELERATORS
BEGIN
VK_DELETE, IDM_EXIT, VIRTKEY, SHIFT, CONTROL, NOINVERT
"5", IDM_ABOUT, VIRTKEY, CONTROL, NOINVERT
"1", IDM_SHIFT1, VIRTKEY, SHIFT, CONTROL, NOINVERT
"2", IDM_SHIFT2, VIRTKEY, SHIFT, CONTROL, NOINVERT
"3", IDM_SHIFT3, VIRTKEY, SHIFT, CONTROL, NOINVERT
"4", IDM_SHIFT4, VIRTKEY, SHIFT, CONTROL, NOINVERT
"1", IDM_CTRL1, VIRTKEY, CONTROL, NOINVERT
"2", IDM_CTRL2, VIRTKEY, CONTROL, NOINVERT
"3", IDM_CTRL3, VIRTKEY, CONTROL, NOINVERT
END
关于加速键,我们在文件夹中找到自己创建该项目时一起生成的.rc文件(注意:这次不是在Microsoft Visual Studio打开,而是用找到文件存放的文件夹然后用记事本打开),打开之后,找到上面代码所示的 Accelerator部分,可以直接对.rc文件进行修改,然后保存就可以设置加速键。
举个栗子:
“1”, IDM_SHIFT1, VIRTKEY, SHIFT, CONTROL, NOINVERT
表示的加速键就是Control+Shift+1
VK_DELETE, IDM_EXIT, VIRTKEY, SHIFT, CONTROL, NOINVERT
表示的加速键就是Control+Shift+Delete
“1”, IDM_CTRL1, VIRTKEY, CONTROL, NOINVERT
表示的加速键就是Control+1
注意:其中的IDM_…对应的是你创建的菜单选项的ID
消息框
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK ||LOWORD(wParam)==IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
return (INT_PTR)FALSE;
}
case IDM_CTRL1:
if(DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG3), hWnd, About)==IDOK){
hdc=GetDC(hWnd);
hello=TEXT("当前使用的图标是:图标一");
CheckMenuItem(hMenu,wmId,MF_CHECKED);
CheckMenuItem(hMenu,IDM_CTRL2,MF_UNCHECKED);
CheckMenuItem(hMenu,IDM_CTRL3,MF_UNCHECKED);
SetClassLong (hWnd,GCL_HICONSM,(LONG)LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1)));
TextOut(hdc,100,100,hello,lstrlen(hello));
ReleaseDC(hWnd,hdc);
}
break;
1.关于消息框,有只有确认和既有确认还有返回的两种。
LOWORD(wParam) == IDOK ||LOWORD(wParam)==IDCANCEL
其中IDOK表示的是确认,IDCANCEL表示的是返回
if(DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG3), hWnd, About)==IDOK)
DialogBox这个函数表示的是创建对话框,若你选择的是确认,则该函数返回值是IDOK,若你选择的是返回,则该函数返回的是IDCANCEL
2.创建对话框
可以在Microsoft Visual Studio中打开.rc文件,选择Dialog进行添加即可
我理解的也比较浅显,希望能对大家有些帮助吧!