LESSON1
Windows程序运行原理及程序编写流程,窗口产生过程,句柄原理,消息队列,回调函数,窗口关闭与应用程序退出的工作关系,使用VC++的若干小技巧,stdcall与cdecl调用规范的比较,初学者常犯错误及注意事项。
句柄 HANDLE 资源的标识
操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。
按照资源的类别,句柄可以分为:
图标句柄 HICON
光标句柄 HCURSOR
窗口句柄 HWND
应用程序实例句柄 HINSTANCE
WM_KEYDOWN 消息宏 UNIT
WPARAM LPARAM都是整型数 可以从变量的类型区分变量的用途 消息的附加参数
WM_CHAR 按下字母的消息
WORD 16位整数 DWORD32位整数
LPSTR LongPointSTR 指向字符串首地址的指针
WinMain参数的含义
lpCmdLine 命令行参数 工程->设置->debug-》程序变量U中设置
nCmdShow 窗口显示状态 最大化呢一般大小呢还是最小化显示
窗口创建步奏
1设计一个窗口
2注册一个窗口
3创建窗口
4显示及更新窗口
WndClass结构体
wndcls.style=CS_HREDRAW | CS_VREDRAW;//水平和垂直重画 当水平和垂直方向上大小发生改变时
在我们的程序中经常要用到一类变量,这个变量里的每一位(bit)都对应某一种特性。当该变量的某位为1时,表示有该位对应的那种特性,当该位为0时,即没有该位所对应的特性。当变量中的某几位同时为1时,就表示同时具有几种特性的组合。一个变量中的哪一位代表哪种意义,不容易记忆,所以我们经常根据特征的英文拼写的大写去定义一些宏,该宏所对应的数值中仅有与该特征相对应的那一位(bit)为1,其余的bit都为0。我们使用goto definition就能发现CS_VREDRAW=0x0001,CS_HREDRAW=0x0002,CS_DBLCLKS =0x0008,CS_NOCLOSE=0x0200。他们的共同点就是只有一位为1,其余位都为0。如果我们希望某一变量的数值既有CS_VREDRAW特性,又有CS_HREDRAW特性,我们只需使用二进制OR(|)操作符将他们进行或运算相组合,如style=CS_VREDRAW | CS_HREDRAW | CS_NOCLOSE。如果我们希望在某一变量原有的几个特征上去掉其中一个特征,用取反(~)之后再进行与(&)运算,就能够实现,如在刚才的style的基础上去掉CS_NOCLOSE特征,可以用style & ~CS_NOCLOSE实现。
wndcls.lpfnWndProc=WinSunProc;//接受一个函数指针(函数名)
回调函数
回调函数的原理是这样的,当应用程序收到给某一窗口的消息时(还记得前面讲过的消息通常与窗口相关的吗?)(消息结构中的参数HWND hwnd;),就应该调用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
额外字节为0;
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);(左上角的图标)
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;//CT 表示常量
MSDN中[OUT]的含义只需定义一个变量把其地址载入就可以无需初始化。
TRANSLATEMESSAGE(&Msg);可以把WM_KEYDOWN和WM_KEYUP转换为WM_KEYCHAR消息。
LRESULT long型
char szChar[20];
sprintf(szChar,"char is %d",wParam);
格式化输出到szChar中。
HDC 句柄 设备上下文。
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"计算机维新培训中心",strlen("计算机维新培训中心"));
ReleaseDC(hwnd,hdc);
WM_PAINT消息处理
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);//ps[OUT] BeginPaint专用WM_PAINT
TextOut(hDC,0,0,"άÐÂÅàѵ",strlen("άÐÂÅàѵ"));
EndPaint(hwnd,&ps);
不用if(x==1)用if(1==x)
case WM_CLOSE://消息处理
if(IDYES==MessageBox(hwnd,"ÊÇ·ñÕæµÄ½áÊø£¿","weixin",MB_YESNO))
{
DestroyWindow(hwnd);//销毁窗口并发出WM_DESTROY消息
}
break;
case WM_DESTROY: //消息处理
PostQuitMessage(0);//发出WM_QUIT消息,令消息循环的GetMessage()返回0值令循环停止结束程序。
break;
#define CALLBACK _stdcall//标准调用约定pascal dephi中的默认约定
#define WINAPIV _cdecl//c语言调用约定 vc默认约定
两者在参数传入的顺序和堆栈的清除这两方面不同。
设置 工程->设置->C/C++->分类->Code Generation->Calling convention