1)点开我的 Vistual Statio2012----->文件---->新建--->项目--->Win32项目--->确定(选上空项目) --->完成
2)当前结果截图
3)然后新建 我的WinMain.cpp文件,文件开始内容:
1 #include<Windows.h> 2 3 //第一个参数是当前这个应用程序的句柄,就是在你的window任务管理器中看到那个进程 4 //第二个参数是前一个应用程序的句柄,就是有的应用程序含有继承关系,就是一个应用程序A运行完,再运行下一个B,这个A就是hPreInstance,B就是hIstance, 5 6 //第三个参数是命令行参数,命令行就是那个system32 7 //第四个是一个默认的显式方式,就是窗口时可见的 还时不可见的,这个nCmdShow是不可见的 8 int CALLBACK WinMain(HINSTANCE hIstance, 9 HINSTANCE hPreInstance, 10 LPSTR pCmdLine, 11 int nCmdShow) 12 { 13 14 15 //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个) 16 17 //2.注册 18 19 //3.创建 20 21 //4.显式 22 23 //5.消息循环 24 25 26 }
4)在第一个过程中添加代码:
1 //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个) 2 WNDCLASSEX wndclass; 3 wndclass.cbClsExtra=0; 4 wndclass.cbWndExtra=0;//这两个是确定是否要分配额外的空间 5 wndclass.cbSize=sizeof(WNDCLASSEX); 6 wndclass.hbrBackground=//hbrBackground的转定义就是HBRUSH,一个画刷,所以 我要在 最上面创建一个画刷
5)hbrBackground的转定义就是HBRUSH,一个画刷,所以 我要在 最上面创建一个画刷
1 int CALLBACK WinMain(HINSTANCE hIstance, 2 HINSTANCE hPreInstance, 3 LPSTR pCmdLine, 4 int nCmdShow) 5 { 6 //下面的因为要为那个wndclass.hbrBackground创建一个画刷,所以 加了下面的代码 7 HBRUSH hBrush=::CreateSolidBrush(RGB(0,0,255)); 8 //为啥要把这个刷子写在外面,因为要是不用的话,得把它删除 9 //其实这个刷子就是一个句柄,大多数句柄 要是不用的话,必须得把它删除。 10 //然后 我去查帮助文档 11 12 //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个) 13 WNDCLASSEX wndclass; 14 wndclass.cbClsExtra=0; 15 wndclass.cbWndExtra=0;//这两个是确定是否要分配额外的空间 16 wndclass.cbSize=sizeof(WNDCLASSEX); 17 wndclass.hbrBackground=//hbrBackground的转定义就是HBRUSH,一个画刷,所以 我要在 最上面创建一个画刷
6)正如前面我说的 要是i你建立一个句柄,要想着给他删除掉,至于怎么删除,你不会 可以查帮助文档:
然后 你既然创建了画刷 CreateSolidBrush,那个就搜这个函数
7)然后我在我的代码末尾 ,把这个画刷删了
1 #include<Windows.h> 2 3 //第一个参数是当前这个应用程序的句柄,就是在你的window任务管理器中看到那个进程 4 //第二个参数是前一个应用程序的句柄,就是有的应用程序含有继承关系,就是一个应用程序A运行完,再运行下一个B,这个A就是hPreInstance,B就是hIstance, 5 6 //第三个参数是命令行参数,命令行就是那个system32 7 //第四个是一个默认的显式方式,就是窗口时可见的 还时不可见的,这个nCmdShow是不可见的 8 int CALLBACK WinMain(HINSTANCE hIstance, 9 HINSTANCE hPreInstance, 10 LPSTR pCmdLine, 11 int nCmdShow) 12 { 13 14 HBRUSH hBrush=::CreateSolidBrush(RGB(0,0,255)); 15 16 //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个) 17 WNDCLASSEX wndclass; 18 wndclass.cbClsExtra=0; 19 wndclass.cbWndExtra=0;//这两个是确定是否要分配额外的空间 20 wndclass.cbSize=sizeof(WNDCLASSEX); 21 wndclass.hbrBackground=hBrush; 22 //2.注册 23 //3.创建 24 //4.显式 25 //5.消息循环 26 ::DeleteObject(hBrush); 27 }
8)窗口函数(转定义)
1 #include<Windows.h> 2 3 //第一个参数是当前这个应用程序的句柄,就是在你的window任务管理器中看到那个进程 4 //第二个参数是前一个应用程序的句柄,就是有的应用程序含有继承关系,就是一个应用程序A运行完,再运行下一个B,这个A就是hPreInstance,B就是hIstance, 5 6 //第三个参数是命令行参数,命令行就是那个system32 7 //第四个是一个默认的显式方式,就是窗口时可见的 还时不可见的,这个nCmdShow是不可见的 8 int CALLBACK WinMain(HINSTANCE hIstance, 9 HINSTANCE hPreInstance, 10 LPSTR pCmdLine, 11 int nCmdShow) 12 { 13 //下面的因为要为那个wndclass.hbrBackground创建一个画刷,所以 加了下面的代码 14 HBRUSH hBrush=::CreateSolidBrush(RGB(0,0,255)); 15 //为啥要把这个刷子写在外面,因为要是不用的话,得把它删除 16 //其实这个刷子就是一个句柄,大多数句柄 要是不用的话,必须得把它删除。 17 //然后 我去查帮助文档 18 19 //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个) 20 WNDCLASSEX wndclass; 21 wndclass.cbClsExtra=0; 22 wndclass.cbWndExtra=0;//这两个是确定是否要分配额外的空间 23 wndclass.cbSize=sizeof(WNDCLASSEX); 24 wndclass.hbrBackground=hBrush;//hbrBackground的转定义就是HBRUSH,一个画刷,所以 我要在 最上面创建一个画刷 25 wndclass.hCursor=NULL;//光标 26 wndclass.hIcon=NULL;//窗口图标 27 wndclass.hIconSm=NULL;//窗口左上的图标 28 wndclass.hInstance=hIstance;//当前应用程序的句柄,就是那个Winmain函数里面的。 29 wndclass.lpfnWndProc=;//一个函数指针,处理消息的那个函数指针,就是回调函数 30 //2.注册 31 32 //3.创建 33 34 //4.显式 35 36 //5.消息循环 37 38 ::DeleteObject(hBrush); 39 }
两次转定义结果截图:
第二次转定义:
9)然后添加处理消息的回调函数 WndProc
1 #include<Windows.h> 2 3 //这个叫 窗口消息处理函数 4 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 5 { 6 return ::DefWindowProc( hWnd, uMsg, wParam, lParam); 7 } 8 9 //第一个参数是当前这个应用程序的句柄,就是在你的window任务管理器中看到那个进程 10 //第二个参数是前一个应用程序的句柄,就是有的应用程序含有继承关系,就是一个应用程序A运行完,再运行下一个B,这个A就是hPreInstance,B就是hIstance, 11 12 //第三个参数是命令行参数,命令行就是那个system32 13 //第四个是一个默认的显式方式,就是窗口时可见的 还时不可见的,这个nCmdShow是不可见的 14 int CALLBACK WinMain(HINSTANCE hIstance, 15 HINSTANCE hPreInstance, 16 LPSTR pCmdLine, 17 int nCmdShow) 18 { 19 //下面的因为要为那个wndclass.hbrBackground创建一个画刷,所以 加了下面的代码 20 HBRUSH hBrush=::CreateSolidBrush(RGB(0,0,255)); 21 //为啥要把这个刷子写在外面,因为要是不用的话,得把它删除 22 //其实这个刷子就是一个句柄,大多数句柄 要是不用的话,必须得把它删除。 23 //然后 我去查帮助文档 24 25 //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个) 26 WNDCLASSEX wndclass; 27 wndclass.cbClsExtra=0; 28 wndclass.cbWndExtra=0;//这两个是确定是否要分配额外的空间 29 wndclass.cbSize=sizeof(WNDCLASSEX); 30 wndclass.hbrBackground=hBrush;//hbrBackground的转定义就是HBRUSH,一个画刷,所以 我要在 最上面创建一个画刷 31 wndclass.hCursor=NULL;//光标 32 wndclass.hIcon=NULL;//窗口图标 33 wndclass.hIconSm=NULL;//窗口左上的图标 34 wndclass.hInstance=hIstance;//当前应用程序的句柄,就是那个Winmain函数里面的。 35 wndclass.lpfnWndProc=WndProc;//一个函数指针,处理消息的那个函数指针,就是回调函数 36 //2.注册 37 38 //3.创建 39 40 //4.显式 41 42 //5.消息循环 43 44 ::DeleteObject(hBrush); 45 }
10)改字符集
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
第一阶段所有代码完成:
1 #include<Windows.h> 2 3 //这个叫 窗口消息处理函数 4 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 5 { 6 return ::DefWindowProc( hWnd, uMsg, wParam, lParam); 7 } 8 9 //第一个参数是当前这个应用程序的句柄,就是在你的window任务管理器中看到那个进程 10 //第二个参数是前一个应用程序的句柄,就是有的应用程序含有继承关系,就是一个应用程序A运行完,再运行下一个B,这个A就是hPreInstance,B就是hIstance, 11 12 //第三个参数是命令行参数,命令行就是那个system32 13 //第四个是一个默认的显式方式,就是窗口时可见的 还时不可见的,这个nCmdShow是不可见的 14 int CALLBACK WinMain(HINSTANCE hIstance, 15 HINSTANCE hPreInstance, 16 LPSTR pCmdLine, 17 int nCmdShow) 18 { 19 //下面的因为要为那个wndclass.hbrBackground创建一个画刷,所以 加了下面的代码 20 HBRUSH hBrush=::CreateSolidBrush(RGB(0,0,255)); 21 //为啥要把这个刷子写在外面,因为要是不用的话,得把它删除 22 //其实这个刷子就是一个句柄,大多数句柄 要是不用的话,必须得把它删除。 23 //然后 我去查帮助文档 24 25 //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个) 26 WNDCLASSEX wndclass; 27 wndclass.cbClsExtra=0; 28 wndclass.cbWndExtra=0;//这两个是确定是否要分配额外的空间 29 wndclass.cbSize=sizeof(WNDCLASSEX); 30 wndclass.hbrBackground=hBrush;//hbrBackground的转定义就是HBRUSH,一个画刷,所以 我要在 最上面创建一个画刷 31 wndclass.hCursor=NULL;//光标 32 wndclass.hIcon=NULL;//窗口图标 33 wndclass.hIconSm=NULL;//窗口左上的图标 34 wndclass.hInstance=hIstance;//当前应用程序的句柄,就是那个Winmain函数里面的。 35 wndclass.lpfnWndProc=WndProc;//一个函数指针,处理消息的那个函数指针,就是回调函数 36 wndclass.lpszClassName="wangchao"; 37 wndclass.lpszMenuName=NULL;//菜单的名字 38 wndclass.style=CS_HREDRAW|CS_VREDRAW;//窗口类的样式,就是 垂直刷新和水平刷新 39 40 //2.注册 41 42 //3.创建 43 44 //4.显式 45 46 //5.消息循环 47 48 ::DeleteObject(hBrush); 49 }
11)2.注册代码:
1 //2.注册(将上面的那个窗口给注册上) 2 if(::RegisterClassEx(&wndclass)==FALSE) 3 { 4 ::MessageBox(NULL,"dhsakfljadsf","提示",MB_OK); 5 //像函数里面用的宏,一般是函数名字的第一个字母,看MessageBox--->MB 6 return 0; 7 }
12)3.创建代码:
1 } 2 //3.创建 3 //你在wndclass.lpszClassName给的啥名字,在CreateWindow()给的就是啥名字 4 //这个第二个参数,是你的那个窗口左上角的标题 5 //第三个是窗口的样子,你把他转定义,里卖弄有很多 6 //第四个和第五个是窗口的起始位置 7 //第六个和第七个是窗口的大小 8 //第八个是父窗口句柄,没有 9 //第九个是应用程序句柄,只要是应用程序句柄,都写WinMain中的那个hInstance 10 HWND hWnd=::CreateWindow("wangchao","王超",WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,hIstance); 11 if(hWnd==NULL) 12 { 13 ::MessageBox(NULL,"创建失败","提示",MB_OK); 14 return 0; 15 }
13)4.显式代码
1 //4.显式 2 //这个SW_SHOW就是一个宏,它就是ShowWindow-->SW,SW_SHOW显式,SW_HIDE隐藏 3 //第一个变量是显式哪一个窗口,就是上面的我们创建的那个hWnd 4 ::ShowWindow(hWnd,SW_SHOW);
14)5.消息循环函数:
1 //5.消息循环 2 //定义一个消息句柄 3 MSG msg; 4 //函数的第一个变量是 取到的什么消息,第二个是这个消息是来自哪一个窗口(如果给0,说的是所有窗口的消息) 5 //最后那个是消息的范围,0,0是所有的范围,要是写10 20 就是取第10个到第20个消息 6 while(::GetMessage(&msg,0,0,0)) 7 { 8 //第一步先翻译 9 ::TranslateMessage(&msg); 10 //第二部分发 11 ::DispatchMessageA(&msg); 12 13 }
15)整个代码:
1 #include<Windows.h> 2 3 //这个叫 窗口消息处理函数 4 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 5 { 6 return ::DefWindowProc( hWnd, uMsg, wParam, lParam); 7 } 8 9 //第一个参数是当前这个应用程序的句柄,就是在你的window任务管理器中看到那个进程 10 //第二个参数是前一个应用程序的句柄,就是有的应用程序含有继承关系,就是一个应用程序A运行完,再运行下一个B,这个A就是hPreInstance,B就是hIstance, 11 12 //第三个参数是命令行参数,命令行就是那个system32 13 //第四个是一个默认的显式方式,就是窗口时可见的 还时不可见的,这个nCmdShow是不可见的 14 int CALLBACK WinMain(HINSTANCE hIstance, 15 HINSTANCE hPreInstance, 16 LPSTR pCmdLine, 17 int nCmdShow) 18 { 19 //下面的因为要为那个wndclass.hbrBackground创建一个画刷,所以 加了下面的代码 20 HBRUSH hBrush=::CreateSolidBrush(RGB(0,0,255)); 21 //为啥要把这个刷子写在外面,因为要是不用的话,得把它删除 22 //其实这个刷子就是一个句柄,大多数句柄 要是不用的话,必须得把它删除。 23 //然后 我去查帮助文档 24 25 //1.设计---->就是给WNDCLASSEX结构体初始化(结构体有12个) 26 WNDCLASSEX wndclass; 27 wndclass.cbClsExtra=0; 28 wndclass.cbWndExtra=0;//这两个是确定是否要分配额外的空间 29 wndclass.cbSize=sizeof(WNDCLASSEX); 30 wndclass.hbrBackground=hBrush;//hbrBackground的转定义就是HBRUSH,一个画刷,所以 我要在 最上面创建一个画刷 31 wndclass.hCursor=NULL;//光标 32 wndclass.hIcon=NULL;//窗口图标 33 wndclass.hIconSm=NULL;//窗口左上的图标 34 wndclass.hInstance=hIstance;//当前应用程序的句柄,就是那个Winmain函数里面的。 35 wndclass.lpfnWndProc=WndProc;//一个函数指针,处理消息的那个函数指针,就是回调函数 36 wndclass.lpszClassName="wangchao"; 37 wndclass.lpszMenuName=NULL;//菜单的名字 38 wndclass.style=CS_HREDRAW|CS_VREDRAW;//窗口类的样式,就是 垂直刷新和水平刷新 39 40 //2.注册(将上面的那个窗口给注册上) 41 if(::RegisterClassEx(&wndclass)==FALSE) 42 { 43 ::MessageBox(NULL,"dhsakfljadsf","提示",MB_OK); 44 //像函数里面用的宏,一般是函数名字的第一个字母,看MessageBox--->MB 45 return 0; 46 } 47 //3.创建 48 //你在wndclass.lpszClassName给的啥名字,在CreateWindow()给的就是啥名字 49 //这个第二个参数,是你的那个窗口左上角的标题 50 //第三个是窗口的样子,你把他转定义,里卖弄有很多 51 //第四个和第五个是窗口的起始位置 52 //第六个和第七个是窗口的大小 53 //第八个是父窗口句柄,没有 54 //第九个是应用程序句柄,只要是应用程序句柄,都写WinMain中的那个hInstance 55 HWND hWnd=::CreateWindow("wangchao","王超",WS_OVERLAPPEDWINDOW,100,0,500,500,NULL,hIstance); 56 if(hWnd==NULL) 57 { 58 ::MessageBox(NULL,"创建失败","提示",MB_OK); 59 return 0; 60 } 61 //4.显式 62 //这个SW_SHOW就是一个宏,它就是ShowWindow-->SW,SW_SHOW显式,SW_HIDE隐藏 63 //第一个变量是显式哪一个窗口,就是上面的我们创建的那个hWnd 64 ::ShowWindow(hWnd,SW_SHOW); 65 //5.消息循环 66 //定义一个消息句柄 67 MSG msg; 68 //函数的第一个变量是 取到的什么消息,第二个是这个消息是来自哪一个窗口(如果给0,说的是所有窗口的消息) 69 //最后那个是消息的范围,0,0是所有的范围,要是写10 20 就是取第10个到第20个消息 70 while(::GetMessage(&msg,0,0,0)) 71 { 72 //第一步先翻译 73 ::TranslateMessage(&msg); 74 //第二部分发 75 ::DispatchMessageA(&msg); 76 77 } 78 79 80 ::DeleteObject(hBrush); 81 }
16)最终结果截图: