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

来源:互联网 发布:淘宝机器人在哪里设置 编辑:程序博客网 时间:2024/04/30 02:16

    在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;  //附加字节,一般为0wcex.cbWndExtra= 0;  //附加字节,一般为0wcex.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>




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子d和b分不清怎么办 和家人走散后怎么办幼儿教案 小孩胃口不好不爱吃饭怎么办 幼儿园孩子学习记不住怎么办 幼儿园小孩数字记不住怎么办 大班教案走丢了怎么办 ppt加视频反了怎么办 拔罐之后背疼怎么办 拔完火罐后背疼怎么办 打印机红色的口堵了怎么办 打印机红色复印不出来怎么办 打印机加错颜色墨水怎么办 中班安全教案脚扭伤了怎么办 中班脚扭伤了怎么办教案 中班安全脚扭伤了怎么办 中班安全脚扭伤了怎么办反思 走丢了怎么办教案反思 汽车后轱辘不转怎么办 走丢了怎么办社会教案 小老鼠搬鸡蛋鸡蛋太大怎么办 小班走丢了怎么办教案 小班走丢了怎么办反思 房屋外墙漏水物业不管怎么办 厨房墙砖用色花怎么办 小孩子做错事很偏激怎么办 孩子在学校偷钱怎么办 房间墙壁上到处有湿虫怎么办 买了西晒的房子怎么办 墙面瓷砖下水管漏水怎么办 西晒房间开空调没效果怎么办 墙纸被小孩画了怎么办 集成墙板缝隙大怎么办 高血压变低血压怎么办会恢复吗 总是感觉睡不够好困怎么办 两岁宝宝说有鬼怎么办 阳台改成了卧室晒衣服怎么办 室外墙角边墙泥受潮脱落怎么办 新房装修墙体发霉了怎么办 宝宝吃多了发烧怎么办 宝宝睡觉不爱盖被子怎么办 1岁宝宝不盖被子怎么办