码迷,mamicode.com
首页 > Windows程序 > 详细

hello-win程序入门win32基本窗口框架全解析

时间:2015-07-24 12:52:27      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:windows

    在VC++6.0环境中创建win32程序

技术分享

选择第三个这时可以运行看到hello world了。

技术分享

程序解析:

#define MAX_LOADSTRING 100  \\定义最大字长</span>
HINSTANCE hInst;		\\当前进程资源的句柄					
TCHAR szTitle[MAX_LOADSTRING];   \\窗口上方显示的标题					
TCHAR szWindowClass[MAX_LOADSTRING];  \\窗口定义的名称							

实际上前面第一行的句柄就相当于ID号,每运行一个进程都需要系统分配一个编码来标示它。TCHAR是双字节的字符类型,char为单字节。


这是win32程序的主程序相当于main:

int APIENTRY WinMain(HINSTANCE hInstance,  //当前实例的句柄(标志)windows是多任务操作系统,一个程序可以运行多个实例,为了区分它
                     HINSTANCE hPrevInstance,  //前一个实例的句柄
                     LPSTR     lpCmdLine, //长字符串指针数据类型,传给WinMain命令
                     int       nCmdShow) //指定窗口如何显示,应用程序常不理会该值
{.
	MSG msg;  //消息数据类型
	HACCEL hAccelTable;  //存放键盘加速键表的句柄,键盘加速键是应用程序使用的快捷键如word下ALT+F查找
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); //将IDS_APP_TITLE里的内容载入字符串szTitle中
	LoadString(hInstance, IDC_TEST, szWindowClass, MAX_LOADSTRING); //将IDC_TEST里的内容载入字符串szWindowClass中
	MyRegisterClass(hInstance);  //注册窗口
	if (!InitInstance (hInstance, nCmdShow))   //启动窗口,失败则程序退出
        {
           return FALSE;
  	}
  	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_TEST); //载入快捷键表,该表能在资源VC的视图中看到
	while (GetMessage(&msg, NULL, 0, 0)) //消息循环,如果得到退出消息返回0
	{
           if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) //如果是不是快捷键则进入if,是则直接发给窗口过程
	   {
	       TranslateMessage(&msg);  //翻译消息
	       DispatchMessage(&msg);  //发送消息给窗口过程
           }
	}
	return msg.wParam;  //返回退出
}

窗口注册函数

ATOM MyRegisterClass(HINSTANCE hInstance)  //ATOM为unsigned short类型
{
	WNDCLASSEX wcex;  //定义一个窗口类

	wcex.cbSize = sizeof(WNDCLASSEX); //窗口大小

	wcex.style			= CS_HREDRAW | CS_VREDRAW; //窗口风格,用|符号能够同时选中,具体类型看下面的图
	wcex.lpfnWndProc	= (WNDPROC)WndProc;  //窗口过程函数,下面有定义
	wcex.cbClsExtra		= 0;  //附加字节,一般为0
	wcex.cbWndExtra		= 0;  //附加字节,一般为0
	wcex.hInstance		= hInstance;  //实例句柄
	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_TEST);  //窗口图标,可以在资源视图中改
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);  //窗口中光标的风格
 	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);  //窗口画刷颜色
	wcex.lpszMenuName	= (LPCSTR)IDC_TEST;  //菜单资源名称,可以在资源视图中改
	wcex.lpszClassName	= szWindowClass;  //窗口类名称
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);   //窗口小图标

	return RegisterClassEx(&wcex);  //注册
}

窗口风格:

技术分享


启动窗口:

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)  //启动窗口函数,第二个参数为启动类型
{
   HWND hWnd;  //定义窗口句柄(标识)

   hInst = hInstance; // Store instance handle in our global variable,翻译过来是将记录当前实例的句柄设置为该实例

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,  //创建窗口
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)  //判断是否创建成功
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);  //显示窗口
   UpdateWindow(hWnd);  //刷新窗口

   return TRUE;
}


窗口过程:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)  //回掉系统API窗口过程函数,后面两个参数为消息
{                                                                                //附加信息
	int wmId, wmEvent;
	PAINTSTRUCT ps;  //保存了窗口绘制信息
	HDC hdc;  //窗口中元素的句柄
	TCHAR szHello[MAX_LOADSTRING];  //定义双字节字符串
	LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);  //将资源表里的字符给szHello变量
	switch (message)   //选择消息
	{
		case WM_COMMAND:  //菜单中选中一个命令时得到的消息
			wmId    = LOWORD(wParam); 
			wmEvent = HIWORD(wParam); 
			// Parse the menu selections:
			switch (wmId)
			{
				case IDM_ABOUT:   //关于
				   DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);  //跳出新图形窗口
				   break;
				case IDM_EXIT:   //退出
				   DestroyWindow(hWnd);  //销毁窗口
				   break;
				default:
				   return DefWindowProc(hWnd, message, wParam, lParam);
			}
			break;
		case WM_PAINT:  //绘制,该消息在窗口拉伸收缩、最小化后能接收到
			hdc = BeginPaint(hWnd, &ps);
			// TODO: Add any drawing code here...
			RECT rt;  //定义矩形变量
			GetClientRect(hWnd, &rt);  //将窗口尺寸赋给矩形变量
			DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);  //在窗口上打印szHello里的内容
                        //当需要在指定位置格式化输出可以使用:TextOut(hdc,1,1,buff,wsprintf(buff,TEXT("lalla %i"),aa));i为int类型
                        //先要定义TCHAR类型输出缓冲数组buff
                        //如果需要强制重绘,可以用InvalidateRect(hWnd,NULL,TRUE);
                        EndPaint(hWnd, &ps);  //结束绘制
			break;
		case WM_DESTROY:
			PostQuitMessage(0);
			break;
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}</span>
关于:

LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)  //菜单中点击关于弹出的小窗口
{
	switch (message)  //选择消息
	{
		case WM_INITDIALOG:  //此处添加初始化时进行的内容,默认没有添加
				return TRUE;  //正常退出

		case WM_COMMAND:  //选择了其中的按钮
			if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) //如果点"确定"或者"取消"
			{
				EndDialog(hDlg, LOWORD(wParam));  //结束
				return TRUE;  //正常退出
			}
			break;
	}
    return FALSE;  //异常退出
}</span>




版权声明:本文为博主原创文章,未经博主允许不得转载。

hello-win程序入门win32基本窗口框架全解析

标签:windows

原文地址:http://blog.csdn.net/calcular/article/details/47036079

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!