关于VC++创建窗口及修饰浅谈

@[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进行添加即可

我理解的也比较浅显,希望能对大家有些帮助吧!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值