VS2010 win32项目windows窗体程序 向导生成代码解析
目录:
1.Win32项目的windows窗体程序的向导生成了如下代码
2.手工生成代码如下
3.当消息队列中没有消息需要处理,我们可以利用这段时间处理我们自己的任务
1.Win32项目的windows窗体程序的向导生成了如下代码:
- // Timer.cpp : 定义应用程序的入口点。
- //
- #include "stdafx.h"
- #include "Timer.h"
- #define MAX_LOADSTRING 100
- // 全局变量:
- HINSTANCE hInst; // 当前实例
- TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
- TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名
- // 此代码模块中包含的函数的前向声明:
- ATOM MyRegisterClass(HINSTANCE hInstance);
- BOOL InitInstance(HINSTANCE, int);
- LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
- INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
- int APIENTRY _tWinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPTSTR lpCmdLine,
- int nCmdShow)
- {
- UNREFERENCED_PARAMETER(hPrevInstance);
- UNREFERENCED_PARAMETER(lpCmdLine);
- // TODO: 在此放置代码。
- MSG msg;
- HACCEL hAccelTable;
- // 初始化全局字符串
- LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); ///加载标题栏字符串
- LoadString(hInstance, IDC_TIMER, szWindowClass, MAX_LOADSTRING); ///加载“关于对话框”
- MyRegisterClass(hInstance);
- // 执行应用程序初始化:
- if (!InitInstance (hInstance, nCmdShow))
- {
- return FALSE;
- }
- /*函数原型:int TranslateAccelerator(HWND hWnd,HACCEL hAccTable,LPMSG IpMsg);
- 函数功能:翻译加速键表。该函数处理菜单命令中的加速键。该函数将一个WM_KEYDOWN或WM_SYSKEYDOWN消息翻译
- 成一个WM_COMMAND或WM_SYSCOMMAND消息(如果在给定的加速键表中有该键的入口),然后将WM_COMMAND或
- WM_SYSCOMMAND消息直接送到相应的窗口处理过程。
- TranslateAccelerator直到窗口过程处理完消息后才返回。
- 参数:
- hWnd:窗口句柄,该窗口的消息将被翻译。
- hAccTable:加速键表句柄。加速键表必须由LoadAccelerators函数调用装入或由CreateAccd_eratorTable函数调用创建。
- LpMsg:MSG结构指针,MSG结构中包含了从使用GetMessage或PeekMessage函数调用线程消息队列中得到的消息内容。
- 返回值:若函数调用成功,则返回非零值;若函数调用失败,则返回值为零。若要获得更多的错误信息,可调用GetLastError函数。
- */
- hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TIMER));
- // 主消息循环:
- while (GetMessage(&msg, NULL, 0, 0))
- {
- if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- }
- return (int) msg.wParam;
- }
- //
- // 函数: MyRegisterClass()
- //
- // 目的: 注册窗口类。
- //
- // 注释:
- //
- // 仅当希望
- // 此代码与添加到 Windows 95 中的“RegisterClassEx”
- // 函数之前的 Win32 系统兼容时,才需要此函数及其用法。调用此函数十分重要,
- // 这样应用程序就可以获得关联的
- // “格式正确的”小图标。
- //
- 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_TIMER)); ///图标
- wcex.hCursor = LoadCursor(NULL, IDC_ARROW); ///光标
- wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); ///背景画刷设定
- wcex.lpszMenuName = /*MAKEINTRESOURCE(IDC_TIMER)*/NULL; ///菜单
- wcex.lpszClassName = szWindowClass; //注册类
- wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); ///小图标
- return RegisterClassEx(&wcex);
- }
- //
- // 函数: InitInstance(HINSTANCE, int)
- //
- // 目的: 保存实例句柄并创建主窗口
- //
- // 注释:
- //
- // 在此函数中,我们在全局变量中保存实例句柄并
- // 创建和显示主程序窗口。
- //
- BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
- {
- HWND hWnd;
- hInst = hInstance; // 将实例句柄存储在全局变量中
- hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
- if (!hWnd)
- {
- return FALSE;
- }
- ///MoveWindow(hWnd,100,100,640,320,true);
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
- return TRUE;
- }
- //
- // 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
- //
- // 目的: 处理主窗口的消息。
- //
- // WM_COMMAND - 处理应用程序菜单
- // WM_PAINT - 绘制主窗口
- // WM_DESTROY - 发送退出消息并返回
- //
- //
- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- int wmId, wmEvent;
- PAINTSTRUCT ps;
- HDC hdc;
- switch (message)
- {
- case WM_COMMAND:
- wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
- // 分析菜单选择:
- switch (wmId)
- {
- case IDM_ABOUT:
- DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
- break;
- case IDM_EXIT:
- DestroyWindow(hWnd);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- break;
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- // TODO: 在此添加任意绘图代码...
- EndPaint(hWnd, &ps);
- break;
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- default:
- return DefWindowProc(hWnd, message, wParam, lParam);
- }
- return 0;
- }
- // “关于”框的消息处理程序。
- 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;
- }
2.手工生成代码如下:
- #include <windows.h>
- void MyPaint(HDC hdc, LPARAM lParam )
- {
- //绘图代码
- }
- //我的消息过程处理函数
- LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- PAINTSTRUCT ps;
- HDC hdc;
- switch (message)
- {
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- EndPaint(hWnd,&ps);
- break;
- case WM_MOUSEMOVE:
- hdc = GetDC(hWnd);
- MyPaint(hdc,lParam);
- ReleaseDC(hWnd,hdc);
- break;
- case WM_DESTROY:
- PostQuitMessage(0);
- break;
- default:
- return DefWindowProc(hWnd, message,wParam,lParam);
- }
- return 0;
- }
- //初始化实例函数
- BOOL InistInstance( HINSTANCE hInstance, int nCmdShow)
- {
- HWND hWnd;
- hWnd = CreateWindow("canvas","绘图窗口",WS_OVERLAPPEDWINDOW, 350,110,CW_USEDEFAULT,50,NULL,NULL,hInstance,NULL);
- if ( !hWnd )
- {
- return FALSE;
- }
- MoveWindow( hWnd,350,110,450,250,true);
- ShowWindow( hWnd, nCmdShow);
- UpdateWindow( hWnd);
- return TRUE;
- }
- //我的窗口注册函数
- ATOM MyRegisterClass(HINSTANCE hInstance)
- {
- WNDCLASSEX wcex;
- wcex.cbSize = sizeof(WNDCLASSEX);
- wcex.style = CS_HREDRAW | CS_VREDRAW;
- wcex.lpfnWndProc = (WNDPROC)WndProc;
- wcex.cbClsExtra = 0;
- wcex.cbWndExtra = 0;
- wcex.hInstance = hInstance;
- wcex.hIcon = NULL;
- wcex.hCursor = LoadCursor(NULL,IDC_ARROW);
- wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1 );
- wcex.lpszMenuName = NULL;
- wcex.lpszClassName = "canvas";
- wcex.hIconSm = NULL;
- return RegisterClassEx(&wcex);
- }
- //程序入口函数
- int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
- {
- MSG msg;
- MyRegisterClass(hInstance);
- if ( !InistInstance(hInstance,nCmdShow))
- {
- return FALSE;
- }
- while ( GetMessage( &msg, NULL, 0, 0) )
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return msg.wParam;
- }
3.当消息队列中没有消息需要处理,我们可以利用这段时间处理我们自己的任务:
- // 消息循环
- MSG msg;
- ZeroMemory(&msg, sizeof(msg)); //这句特别重要,因为需要将msg初始化后才不会引起编译异常、运行异常
- while (msg.message!=WM_QUIT)
- {
- if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- else
- {
- Direct3DRender(); // 绘制3D场景
- }
- }
VS2010 win32项目windows窗体程序 向导生成代码解析的更多相关文章
- 如何给windows窗体程序打包成一个安装包
http://blog.csdn.net/xyy410874116/article/details/6341787 给windows窗体程序打包成一个安装包:具体操作在:http://hi.baidu ...
- Windows 窗体设计器生成的代码
namespace 窗体的浮动及隐藏{ partial class Form1 { /// <summary> /// 必需的设计器变量. ...
- 捕捉WPF应用程序中XAML代码解析异常
原文:捕捉WPF应用程序中XAML代码解析异常 由于WPF应用程序中XAML代码在很多时候是运行时加载处理的.比如DynamicResource,但是在编译或者运行的过程中,编写的XAML代码很可能有 ...
- .net中关于Windows窗体程序和Web网站程序调用自己的服务
在.NET Framework 4.0创建服务是中没有像3.5那样的选择新建-网站-ASP.NET Web服务模块,但在4.0中可以选择 新建-网站-ASP.NET空网站-选中项目右键添加新项- 选择 ...
- VS中空项目、win32项目、控制台程序的区别(转)
空项目,大多数想单纯创建c++工程的新同学,打开vs后很可能不知道选择创建什么工程,这时候请相信我,空项目是你最好的选择.因为空工程不包含任何的源代码文件,接下来你只需要在相应的源代码文件夹和头文件文 ...
- VS2010 Win32项目的源码位置设置
在VS2010中,我们可以创建一个Win32项目用来编辑C或CPP代码,项目建好后我们向项目文件夹添加代码文件,并调试能正常运行. 有时候我们会发现项目目录下没有源文件,这种情况下,可以通过设置“输出 ...
- NSIS安装与向导生成代码
NSIS 的脚本语言和通常的编程语言有类似的结构和语法,但它是为安装程序这类应用所设计的.NSIS (Nullsoft Scriptable Install System) 是一个专业开源的制作 wi ...
- MFC应用程序向导生成的文件
比方说我们用Visio Studio创建了一个MFC应用程序,名称为Mysdi.在创建这个项目的时候,默认的会生成许多类和文件,就关于这些文件的内容和要点展开以下论述. 框架窗口类头文件 向导为项目M ...
- C# windows窗体程序打包安装及卸载
一.新建安装部署项目
随机推荐
- JVM学习之GC参数设置
1: heap size a: -Xmx 指定jvm的最大heap大小,如:-Xmx2g b: -Xms 指定jvm的最小heap大小,如:-Xms1g c: -Xmn 指定jvm中New Gener ...
- css中em与px
Px是绝对定位 em是相对定位 1. em的值并不是固定的: 2. em会继承父级元素的字体大小. em应用: 1. body选择器中声明Font-size=62.5%:(注:在ie中把body选 ...
- 概率法求解三阶幻方[C语言]
#include <stdio.h> #include <string.h> ]={,,,,,,,,}; ]; ][]; int sum(int su[]) { ; ;su[i ...
- 引用(ajaxfileupload.js) ajaxfileupload.js报这错jQuery.handleError is not a function
jQuery.handleError is not a function 原因是,经测试handlerError只在jquery-1.4.2之前的版本中存在,jquery-1.6 和1.7中都没有这个 ...
- Linux中的cron计划任务配置方法(详细)
cron来源于希腊单词chronos(意为“时间”),指Linux系统下一个自动执行指定任务的程序(计划任务) 1. crontab命令选项 #crontab -u <-l, -r, -e> ...
- FAQ:Python中*args和**agrs的区别
python提供了两种特别的方法来定义函数的参数: 1. 位置参数 *args, 把参数收集到一个元组中,作为变量args >>>def show_args(*args): ...
- onActivityResult不起作用?可能是和你的launchMode有关!
昨天在自己的项目中用到了onActivityResult()方法获得activity的返回值.我从Activity01通过 startActivityForResult启动了Activity02和Ac ...
- 解密电子书之一:电子墨水(eink)
今日,关于电子书的话题不断,先是盛大抖了个攒,测试/定价/赔钱的营销策略引来多方质疑.而后汉王又抛出个8寸/800MHz/ARM A8的指标产品大打性能牌. 身为电子行业网站,与非网在时尚数码热潮面前 ...
- idea破解码
43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiI ...
- 点击按钮改变标签内容(采用lambda函数方式)
from Tkinter import* window=Tk() counter=IntVar() counter.set(0) def click(variable,value): variable ...