Window窗口创建过程

Win32项目—用C语言写的。。。

#include<windows.h>
#include "stdio.h"
/*
1.定义入口函数winMain()
2.创建一个窗口
     A.设计窗口类WNDCLASS(给成员变量赋值)
     B.注册窗口类
     C.创建窗口类
	 D.显示和更新窗口        显示和更新窗口  可以看文档 MSDN  winAPI MFC 参考中文文档
3.消息循环

4.窗口过程函数

*/
//对于VS2010 使用F12查看某个参数
//WinAPI是一个修饰函数,告诉参数入栈方式,是从右往左进行的,而且函数调用结束后自动清理堆栈
//CALLBACK也是同样的道理

LRESULT CALLBACK  DealMessage (HWND hWnd,//窗口句柄,消息的所属窗口
	UINT uMsg,//消息标志
	WPARAM wParam,//附加信息
	LPARAM lParam)
{
//	LPPAINTSTRUCT ps;//绘图结构体//
	PAINTSTRUCT ps;//为什么定义这个而不是上面那个
	HDC dc;
	//char *p = "AAAAAAA";
	TCHAR* p = L"AAAAAAAAAAAAA";//luanma 乱码关于字符集的问题;;; 转换宽字节;宽字节:一个字符两个字节//L 宽字节
	switch(uMsg)
	{
	case WM_LBUTTONDOWN:
		MessageBox(hWnd,TEXT("ABC"),TEXT("鼠标左键按下"),MB_OK);//
		break;
	case WM_PAINT:

		{
			//		LPPAINTSTRUCT ps;//绘图结构体  fang kaitou
			dc = BeginPaint(hWnd,&ps);//zai chuangkou shangmian
//			TextOut(dc,20,20,p,strlen(p));//int c = strlen()
			TextOut(dc,20,20,p,wcslen(p));//宽字节de 长度
			EndPaint(hWnd,&ps);//END
			break;
		}
	case WM_DESTROY:
		PostQuitMessage(2);//2 WM_QUIT 给主函数传递  return uMsg.wParam
		break;
	default:
		return DefWindowProc(hWnd,uMsg,wParam,lParam);
	}
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,//应用程序实例
	HINSTANCE hPreInstance,//上一个应用程序实例
	LPSTR lCmdLine,//命令行参数//LPSTR:为 long pointer string 长整型字符串指针 相当于 char*   为什么用long,兼并不同操作系统有的32 64位
	int nCmdShow)//窗口显示的方式:默认最大化,最小化等

{
	HWND hWnd;//????定义必须放在最前面
	MSG msg;//??????
	//A设计窗口类:给窗口类成员赋值
	WNDCLASS wc;
	wc.cbClsExtra = 0;//类的附加信息,可不写
	wc.cbWndExtra = 0;//窗口的附加信息
	                  //获取系统默认的白色画刷
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//背景色,必须写
	//wc.hCursor = NULL;//采用默认光标
	wc.hCursor = LoadCursor(NULL,IDC_HELP);//不采用默认光标,采用一个标准的箭头和问号//第一个参数是应用程序的实例,用NULL就是采用默认的;参数二:光标的名字,见百度或者帮助
	//wc.hIcon = NULL;//图标//采用默认图标
	wc.hIcon = LoadIcon(NULL,IDI_WARNING);//加载系统图标 警告模式
	wc.hInstance = hInstance;//应用程序的实例

	wc.lpfnWndProc = DealMessage;//窗口过程函数名字,消息处理函数

	wc.lpszClassName = TEXT("ABC");//类的名字、、字符集 用TEXT或者其他
	wc.lpszMenuName = NULL;//菜单名字//空,或者默认
	wc.style = nCmdShow;//显示风格

	//B注册窗口类:告诉系统窗口过程函数的入口地址
	RegisterClass(&wc);

	//C创建窗口类:
//	HWND hWnd;//?????
     hWnd = CreateWindow(TEXT("ABC"), TEXT("hello windows"), WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_VSCROLL,
    CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance, NULL);

	if(!hWnd)
		return 0;
	//D显示和更新窗口
	ShowWindow(hWnd,SW_NORMAL);// SW_NORMAL  nCmdShow
	UpdateWindow(hWnd);

	//x消息循环
	//接收到WM_QUIT就退出,返回0  ;出错返回-1
	while(GetMessage(&msg,NULL,0,0))
	{
	//翻译工作
	//虚拟按键转为标准字符WM_CHAR
		TranslateMessage(&msg); 
		//给操作系统分发消息
		DispatchMessage(&msg);
	}

	//待续--2018.10.29  23:38 ZWJ
	return 1;
}

总结【总结】

  1. WinMain中 关于 HWND 和 MSG的定义必须放在此函数的开始处
  2. MessageBox()的参数,看提示信息
    int MessageBox(
    HWND hWnd,
    LPCTSTR lpText,
    LPCTSTR lpCaption,
    UINT uType
    );
    3.在CALLBACK中 输出时字符呈现乱码,则是关于字符集的问题,需要转换为宽字符(一个字符两个字节),用TCHAR定义宽字符,大写 L 表示 是宽字节。。。。。同时,字符串长度得用wcslen来计算,不是strlen
    TCHAR* p = L"AAAAAAAAAAAAA";//luanma 乱码关于字符集的问题;;; 转换宽字节;宽字节:一个字符两个字节//L 宽字节
    4.在switch 中 如果case 块中内容过多,则用{break;} 说明这个是一起的
  3. 窗口类 wc. lpszClassName必须与CreateWindow中窗口类的名字相同,否则窗口会出现不了,CreateWindow 创建的句柄是空的。

猜你喜欢

转载自blog.csdn.net/u012719076/article/details/83515191