WINDOWS应用程序设计用到的基本术语.docx
《WINDOWS应用程序设计用到的基本术语.docx》由会员分享,可在线阅读,更多相关《WINDOWS应用程序设计用到的基本术语.docx(10页珍藏版)》请在冰豆网上搜索。
WINDOWS应用程序设计用到的基本术语
VisualC++入门精解-WINDOWS应用程序设计用到的基本术语
1.窗口
任何一个使用过Windows的人对窗口这个概念绝对不会陌生,窗口是windows应用程序的基本操作单元,用户通过它与应用程序发生交互,例如输入输出操作等等,从程序的内部工作原来来看,每一个窗口对应一个消息处理队列,应用程序主要通过窗口消息处理函数对用户的输入操作进行响应与处理。
要想从程序员的角度充分理解窗口的含义,那么对WNDCLASS这个数据结构进行充分的了解是必须的。
2.实例
单个实例代表一个可执行程序在内存中的拷贝,如果一个应用程序执行许多次,那么在内存中就有多少个拷贝,也就可以说明有多少个实例存在。
3.句柄
句柄在windows环境下被定义成了一个无符号的整数,用于标识应用程序中不同的对象和同类对象中的不同实例。
句柄可以看成是对象的编号,联系上面的实例,那么一个实例句柄就可以看作是单个应用程序在内存中拷贝的唯一身份编号,通常系统只能通过实例句柄去识别不同的应用程序,或者是相同应用程序的不同副本。
4.资源
Windows应用程序包含很多资源,例如,菜单,图标,对话框等等,VC++环境下我们不仅仅可以使用系统下原有的资源,我们也可以定义自己的资源,这些资源被定义在.RC文件中,通过应用程序最后的编译,这些资源文件和程序代码连接在一起,形成一个可执行的.EXE文件或者是一个.DLL的库文件。
在使用这些资源的时候,通过WINAPI函数学将这些资源调用使用。
4.窗口消息处理函数
窗口是人机交互的接口,当窗口接受到输入请求的时候,就会把这一请求交给某一个函数进行处理,而这个函数就是窗口消息处理函数,它能够决定当一个消息被接受到的时候采取什么行动。
消息通常是由一系列的输入操作触发的,比如当我按下鼠标左键那么窗口消息处理函数就会收到一个WM_LBUTTONDOWN的消息信号。
在窗口消息处理函数中,我们可以利用switch和case结构进行控制,针对此消息作出我们想要的操作。
5.图形设备接口
应用程序的任何输出操作都需要通过图形设备接口(GDI)中的函数来完成操作,GDI负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上显示图形或者文字,它将程序员与具体的硬件设备隔离开,让程序员不需要考虑硬件设备操作的细节。
6.回调函数
回调函数是windows操作系统自己调用的函数,用户是不能直接调用他们的。
回调函数的定义必须严格的按照windows标准进行编写。
在下面我们将要看到的HelloWin程序中,WndProc就是一个回调函数,它是是应用程序的窗口消息处理函数,当注册窗口类的时候,要把窗口消息处理函数的地址告诉Windows,Windows通过调用此函数进行消息处理。
匈牙利命名法规则
一般情况下,变量的取名方式为:
++。
范围前缀_,类型前缀_,限定词。
特殊的类型命名,前缀表示:
类、接口
前缀
类型
例子
备注
Lm
Class
LmObject
表示类型本身
不与范围前缀结合使用
I
Interface接口
IUnknown
注:
类名前缀改为Lm,对于非全局的类最好有语义表示其所属模块。
类的实例命名与类名大致相同,只是类名语义表示类的通用含义,而类名表示此实例的具体语义。
如类名LmSketPoint表示草图点的类定义,而它的两个实例_StartPoint,_EndPoint分别代表起点和终点的语义。
类的实例命名带上前缀_。
特殊约定:
a.MouseTool的派生类的前缀为_Mt.
b.对话框类的前缀为CDlg.
c.橡皮条类的前缀为_Rb.
范围前缀:
前缀
类型
例子
备注
g_
全局作用域
g_Servers
m_
成员变量
m_pDoc,
l_
局部作用域
l_strName
少用
注:
编程时尽量少用全程变量,对于全程变量还应在类型前缀后加上如下关键字:
特征模块 :
Fea
草图模块 :
Sket
装配模块 :
Asm
工程图模块:
Lay
曲面模块 :
Surf
界面模块 :
Ui
常用的一般数据类型的前缀
前缀
类型
内存规格描述
例子
ch
char
8-bitcharacter
chGrade
ch
TCHAR
16-bitcharacterif_UNICODEisdefined
chName
b
BOOL
Booleanvalue
bEnabled
n
int
Integer(sizedependentonoperatingsystem)
nLength
n
UINT
Unsignedvalue(sizedependentonoperatingsystem)
nLength
w
WORD
16-bitunsignedvalue
wPos
l
LONG
32-bitsignedinteger
lOffset
dw
DWORD
32-bitunsignedinteger
dwRange
p
*
Ambientmemorymodelpointer
pDoc
lp
FAR*
Farpointer
lpDoc
lpsz
LPSTR
32-bitpointertocharacterstring
lpszName
lpsz
LPCSTR
32-bitpointertoconstantcharacterstring
lpszName
lpsz
LPCTSTR
32-bitpointertoconstantcharacterstringif_UNICODEisdefined
lpszName
h
handle
HandletoWindowsobject
hWnd
lpfn
(*fn)()
callbackFarpointertoCALLBACKfunction
lpfnAbort
常用Windows对象名称缩写
Windows对象
例子变量
MFC类
例子对象
HWND
hWnd;
CWnd*
pWnd;
HDLG
hDlg;
CDialog*
pDlg;
HDC
hDC;
CDC*
pDC;
HGDIOBJ
hGdiObj;
CGdiObject*
pGdiObj;
HPEN
hPen;
CPen*
pPen;
HBRUSH
hBrush;
CBrush*
pBrush;
HFONT
hFont;
CFont*
pFont;
HBITMAP
hBitmap;
CBitmap*
pBitmap;
HPALETTE
hPalette;
CPalette*
pPalette;
HRGN
hRgn;
CRgn*
pRgn;
HMENU
hMenu;
CMenu*
pMenu;
HWND
hCtl;
CStatic*
pStatic;
HWND
hCtl;
CButton*
pBtn;
HWND
hCtl;
CEdit*
pEdit;
HWND
hCtl;
CListBox*
pListBox;
HWND
hCtl;
CComboBox*
pComboBox;
Windows应用程序的基本运行机制与HelloWin程序详解
总的来说最基本的Windows应用程序的运行执行顺序总是以如下的基本顺序执行的。
顺序结构:
调用WinMain函数开始执行--à定义窗口类--à初始化窗口类--à窗口的实例化--à通过消息循环获取消息并将消息发送给消息处理函数做出相应的操作
由于windows应用程序运行的逻辑结构特殊所以代码的详细解释笔者就不把程序于叙述分开了了,这样有利于阅读与分析。
分析代码如下:
//程序作者:
管宁
//站点:
dev-
//所有稿件均有版权,如要转载,请务必注明出处和作者
#include
#pragmacomment(lib,"winmm.lib")//为了要播放声音,必须导入这个库
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,PSTRszCmdLine,intiCmdShow)
HINSTANCE类型的含义为实例句柄。
hInstance事实上就是当前应用程序自身的标识代号,代号通常都是一个32位整数。
hPrevInstance与过去的16位应用程序有关系,表示指向前一个实例的句柄。
PSTR类型的含义是指向以\0结尾的字符串指针。
szCmdLine前面的sz同样是表示指向以\0结尾的字符串指针,这个对象用于保存命令行。
最后iCmdShow是一个整型数据,标记了程序最初的显示状态。
为SW_SHOWNORAML的时候为一般大小显示方式。
为SW_SHOWMAXIMIZED的时候为最大化显示方式。
为SW_SHOWMINNOACTIVE的时候程序将显示在任务栏上。
{
staticcharszAppName[]=TEXT("HelloWin");//预先定义一个c风格字符串,稍后用于设置窗口类名称。
WNDCLASSwndclass;//定义窗口类对象
在这里不得不说一下的是,窗口类事实上是struct结构体,内部有10个分量,他们是用来于初始化窗口类对象而用的。
这个结构体在winuser.h头文件中定义,从方式上来说,分为ASCII版的WNDCLASSA和Unicode版的WNDCLASSW两个。
typedefstructtagWNDCLASSA{
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
}WNDCLASSA,*PWNDCLASSA,NEAR*NPWNDCLASSA,FAR*LPWNDCLASSA;
typedefstructtagWNDCLASSW{
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
}WNDCLASSW,*PWNDCLASSW,NEAR*NPWNDCLASSW,FAR*LPWNDCLASSW;
//-------------------------------窗口类对象初始化过程------------------------------------
wndclass.style =CS_HREDRAW|CS_VREDRAW;
/*
设置窗口类对象的样式风格,CS_HREDRAW|CS_VREDRAW这两个值是通过位运算的与运算结合起来的。
表示了窗口在改变了水平和垂直大小的时候,窗口要强迫刷新。
这些通过define定义的标识,可以在WinUser.h头文件中找到。
#defineCS_VREDRAW 0x0001
#defineCS_HREDRAW 0x0002
#defineCS_DBLCLKS 0x0008
#defineCS_OWNDC 0x0020
#defineCS_CLASSDC 0x0040
#defineCS_PARENTDC 0x0080
#defineCS_NOCLOSE 0x0200
#defineCS_SAVEBITS 0x0800
#defineCS_BYTEALIGNCLIENT 0x1000
#defineCS_BYTEALIGNWINDOW 0x2000
#defineCS_GLOBALCLASS 0x4000
#defineCS_IME 0x00010000
wndclass.lpfnWndProc =WndProc;//指定窗口的处理函数为WndProc,WndProc将处理windows消息。
wndclass.cbClsExtra =0;//窗口类无扩展
wndclass.cbWndExtra =0;//窗口实例无扩展
wndclass.hInstance =hInstance;//指定当前应用程序实例句柄,也就是程序当前的标识号。
wndclass.hIcon =LoadIcon(NULL,IDI_APPLICATION);
/*
通过LoadIcon函数设置应用程序窗口标题的icon图标。
HICONLoadIcon(HINSTANCEhInstance,LPCTSTRlpIconName);
函数返回HICON类型的图标句柄。
第一个参数表示当前应用程序的窗口句柄,第二个参数表示图标。
默认状态下,第一个参数为NULL,第二个为IDI_APPLICATION,表示使用系统默认提供的图标,可以在WinUser.h头文件中找到。
#defineIDI_APPLICATION 32512
*/
wndclass.hCursor =LoadCursor(NULL,IDC_ARROW);
/*
通过LoadCursor函数设置应用程序窗口光标样式。
HCURSORLoadCursor(HINSTANCEhInstance,LPCTSTRlpCursorName);
函数返回HCURSOR类型的光标句柄。
第一个参数表示当前应用程序的窗口句柄,第二个参数表示光标。
默认状态下,第一个参数为NULL,第二个为IDC_ARROW,表示使用系统默认提供的光标,可以在WinUser.h头文件中找到。
#defineIDC_ARROW MAKEINTRESOURCE(32512)
*/
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
/*
通过GetStockObject函数设置应用程序窗口的背景颜色。
HGDIOBJGetStockObject(intfnObject);
函数返回HCURSOR类型的GDI对象句柄,为了程序能够正确执行,必须把HGDIOBJ类型强制转换成HBRUSH画刷句柄。
参数表示当前使用的画刷颜色。
这些常量的定义可以在WinGDI.h头文件中找到。
#defineWHITE_BRUSH 0
#defineLTGRAY_BRUSH 1
#defineGRAY_BRUSH 2
#defineDKGRAY_BRUSH 3
#defineBLACK_BRUSH 4
#defineNULL_BRUSH 5
#defineHOLLOW_BRUSH NULL_BRUSH
*/
wndclass.lpszMenuName =NULL;
wndclass.lpszClassName=szAppName;//窗口类对象的名称
//-----------------------------------------------------------------------------------------
RegisterClass(&wndclass);
/*
注册窗口类,参数为窗口类对象的指针。
函数原形为:
ATOMRegisterClass(CONSTWNDCLASS*lpWndClass);
*/
//-------------------------- 实例化过程 -------------------------------------------------
HWND hwnd;//创建用于保存窗口句柄的对象,窗口句柄是系统识别不同窗口的依据,它只是个代号。
hwnd=CreateWindow(
szAppName, //窗口类名称
"你好世界", //窗口标题
WS_OVERLAPPEDWINDOW, //窗口样式
CW_USEDEFAULT, //初始的窗口x轴位置
CW_USEDEFAULT, //初始的窗口y轴位置
CW_USEDEFAULT, //初始的窗口x轴大小
CW_USEDEFAULT, //初始的窗口y轴大小
NULL, //父窗口句柄