孙鑫vc学习笔记_第一课

LESSON1

Windows程序运行原理及程序编写流程,窗口产生过程,句柄原理,消息队列,回调函数,窗口关闭与应用程序退出的工作关系,使用VC++的若干小技巧,stdcallcdecl调用规范的比较,初学者常犯错误及注意事项。

 

句柄 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=0x0001CS_HREDRAW=0x0002CS_DBLCLKS =0x0008CS_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_KEYDOWNWM_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)if1==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

你可能感兴趣的:(孙鑫vc学习笔记_第一课)