windows程序设计学习笔记.docx

上传人:b****6 文档编号:5384265 上传时间:2022-12-15 格式:DOCX 页数:29 大小:253.74KB
下载 相关 举报
windows程序设计学习笔记.docx_第1页
第1页 / 共29页
windows程序设计学习笔记.docx_第2页
第2页 / 共29页
windows程序设计学习笔记.docx_第3页
第3页 / 共29页
windows程序设计学习笔记.docx_第4页
第4页 / 共29页
windows程序设计学习笔记.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

windows程序设计学习笔记.docx

《windows程序设计学习笔记.docx》由会员分享,可在线阅读,更多相关《windows程序设计学习笔记.docx(29页珍藏版)》请在冰豆网上搜索。

windows程序设计学习笔记.docx

windows程序设计学习笔记

第一章:

开始

Windows.h:

#include:

主要的含入档案,包括了其他windows表头档案,这些表头档案的某些也包含了其他表头档案。

Windef.HWindow数据类型

Winnt.HUnicode字符集的支持

Winbase.HKernel32.dll的头文件

Winuser.Huser32.dll的头文件

Wingdi.H绘图API(GDI32.DLL)的头文件

这些表头定义了windows的所有资料形态、函式呼叫、资料结构和常数识别字,是windows文件中的一个重要部分。

程式进入点:

WinMain函数

大家学习c语言时,还记得其入口函数Main吧,Window也一样,也有一个入口函数,WinMain。

IntWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,

PSTRszCmdLine,intiCmdShow)

WinMain函式宣告为返回一个int值,许多Windows函式呼叫宣告为WINAPI。

IntMessageBox(HWNDhWnd,//父窗口的句柄

LPCTSTRlpText,//显示在提示框中的信息

LPCTSTRlpCaption//提示框标题栏的信息

UINTuType//风格(按钮、图标)

);//返回点击的按钮ID

第二章Unicode简介

Widows字符处理:

1.字符编码方式:

asc码7位代表一个字符,128个字符ASCII码8位代表一个字符,256个字符

DBCS编码单双字节混合编码UNICODE编码采用双字节编码,2个字节代表一个字符;

2.宽字节字符:

wchar_t实际上unsignedshort类型,每个字符占用2个字节char每个字符占用一个字节;

Wchar_t定义时需要增加“L”,通过编译器按照双字节编译字符串,采用Unicode编码;需要使用支持wchar_t的函数操作宽字节;

例如:

wchar_t*pszText=L”HelloWrold”;wprintf(L“%s\n”,pszText);

3.TCHAR:

根据环境不同用UNICODE宏开关切换TCHAR的定义,如果定义UNICODE

宏TCHAR定义为wchar_t,如果未定义UNICODE宏,TCHAR定义为char;

例如:

如果没有定义UNICODE宏

TCHAR*pszText=_TEXT(“Hello”);

替换为:

char*pszText=“Hello”;

如果定义了UNICODE宏

TCHAR*pszText=_TEXT(“Hello”);

替换为:

wchar_t*pszText=L“Hello”;

4.宽字元程式库函式:

获得字串的长度使用strlen()函数

第三章视窗和消息

1.Windows创建窗口时共调用了18个函数:

LoadIcon载入图示供程序使用

LoadCusor载入滑鼠游标供程序使用

GetStockObject取得以一个图形物件

RegisterClass注册视窗类别

MessageBox显示消息

CreateWindow建立窗口

ShowWindow在屏幕上显示视窗

UpdateWindow更新视窗

GetMessage从消息储存列中取得消息

TranslateMessage转译某些键盘消息。

DispatchMessage将消息发送给视窗消息处理程式。

PlaySound播放一个音效档案。

BeginPaint开始绘制视窗。

GetClientRect取得视窗显示区域的大小。

DrawText显示字串。

EndPaint结束绘制视窗。

PostQuitMessage在消息伫列中插入一个「退出程式」消息。

DefWindowProc执行内定的消息处理。

这些函式均在PlatformSDK文件中说明,并在不同的表头档案中宣告,其

中绝大多数宣告在WINUSER.H中。

2.大写字母识别字

这些是简单的数值常数。

字首指示该常数所属的类别,如下

字首类别

CS视窗类别样式

CW建立视窗

DT绘制文字

IDI图示ID

IDC游标ID

MB消息方块

SND声音

WM视窗消息

WS视窗样式

程序员不要费力气去记忆Windows程式设计中的数值常数。

实际上,Windows中使用的每个数值常数在表头档案中均有相应的识别字定义。

3.匈牙利表示法:

在命名结构变数时,可以用结构名(或者结构名的一种缩写)的小写作为变数名的字首,或者用作整个变数名。

匈牙利表示法能够帮助程式写作者及早发现并避免程式中的错误。

字首资料型态

cchar或WCHAR或TCHAR

byBYTE(无正负号字元)

nshort

iint

x,yint分别用作x座标和y座标

cx,cyint分别用作x长度和y长度;C代表「计数器」

b或fBOOL(int);f代表「旗标」

wWORD(无正负号短整数)

lLONG(长整数)

dwDWORD(无正负号长整数)

fnfunction(函数)

sstring(字串)

sz以位元组值0结尾的字串

h代号

p指标

4.注册视窗类别:

RegisterClass注册一个视窗类别该函数只需要一个参数,即WNDCLASS的结构体。

typedefstructtagWNDCLASSW

{

UINTstyle;//视窗类别样式

WNDPROClpfnWndProc;//视窗类别的视窗消息处理程序

intcbClsExtra;//预留的空间

intcbWndExtra;//预留的空间

HINSTANCEhInstance;//程序的执行实体

HICONhIcon;//设置的图标

HCURSORhCursor;//光标

HBRUSHhbrBackground;//背景色

LPCWSTRlpszMenuName;//功能表

LPCWSTRlpszClassName;//类别名称

}WNDCLASSW,*PWNDCLASSW,NEAR*NPWNDCLASSW,FAR*LPWNDCLASSW;

5.建立视窗:

呼叫CreateWindow建立视窗。

hwnd=CreateWindow(szAppName,//windowclassname

TEXT("TheHelloProgram"),//windowcaption

WS_OVERLAPPEDWINDOW,//windowstyle

CW_USEDEFAULT,//initialxposition

CW_USEDEFAULT,//initialyposition

CW_USEDEFAULT,//initialxsize

CW_USEDEFAULT,//initialysize

NULL,//parentwindowhandle

NULL,//windowmenuhandle

hInstance,//programinstancehandle

NULL);

6.显示视窗:

在CreateWindow呼叫传回之後,Windows内部已经建立了这个视窗,然而,光是这样子,视窗并不会出现在视讯显示器上。

您还需要两个函数呼叫,一个是:

ShowWindow(hwnd,iCmdShow);

第一个参数是刚刚用CreateWindow建立的视窗句柄。

第二个参数是作为参数传给WinMain的iCmdShow。

它确定最初如何在萤幕上显示视窗,是一般大小、最小化还是最大化。

如果视窗按一般大小显示,那么WinMain接收到後传递给ShowWindow的就是SW_SHOWNORMAL;如果视窗是最大化显示的,则为SW_SHOWMAXIMIZED。

而如果视窗只显示在工作列上,则是SW_SHOWMINNOACTIVE。

ShowWindow函数在显示器上显示视窗。

如果ShowWindow的第二个参数是SW_SHOWNORMAL,则视窗的显示区域就会被视窗类别中定义的背景画刷所覆盖。

呼叫第二个函数

UpdateWindow(hwnd);

会重画显示区域。

它经由发送给视窗消息处理程式一个WM_PAINT消息做到这一点。

7.消息回圈:

呼叫UpdataWindow后,视窗就出现在了显示器上。

程序现在必须读入用户使用键盘鼠标输入的信息。

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

msg变数是型态为MSG的结构,型态MSG在WINUSER.H中定义如下

typedefstructtagMSG

{

HWNDhwnd;

UINTmessage;

WPARAMwParam;

LPARAMlParam;

DWORDtime;

POINTpt;

}

MSG,*PMSG;

POINT资料型态也是一个结构,它在WINDEF.H中定义如下

typedefstructtagPOINT

{

LONGx;

LONGy;

}

POINT,*PPOINT;

GetMessage(&msg,NULL,0,0)

这一呼叫传给Windows一个指标,指向名为msg的MSG结构。

第二、第三和第四个参数设定为NULL或者0,表示程式接收它自己建立的所有视窗的所有消息。

只要从消息伫列中取出消息的message栏位不为WM_QUIT(其值为0x0012),GetMessage就传回一个非零值。

WM_QUIT消息将导致GetMessage传回0。

叙述TranslateMessage(&msg);将msg结构传给Windows,进行一些键盘转换。

叙述DispatchMessage(&msg);又将msg结构回传给Windows。

然后,Windows将该消息发送给适当的视窗消息处理程式,让它进行处理。

这也就是说,Windows将呼叫视窗消息处理程式。

处理完消息之后,WndProc传回到Windows。

此时,Windows还停留在DispatchMessage呼叫中。

在结束DispatchMessage呼叫的处理之后,Windows回到HELLOWIN,并且接著从下一个GetMessage呼叫开始消息回圈。

视窗消息处理程式总是定义为如下形式:

LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)

8.处理消息:

一般来说,Windows程式写作者使用switch和case结构来确定视窗消息处理程式接收的是什么消息,以及如何适当地处理它。

视窗消息处理程式在处理消息时,必须传回0。

视窗消息处理程式不予处理的所有消息应该被传给名为DefWindowProc的Windows函式。

从DefWindowProc传回的值必须由视窗消息处理程式传回。

switch(iMsg)

{

caseWM_CREATE:

处理WM_CREATE消息

return0;

caseWM_PAINT:

处理WM_PAINT消息

return0;

caseWM_DESTROY:

处理WM_DESTROY消息

return0;

}

returnDefWindowProc(hwnd,iMsg,wParam,lParam);

呼叫DefWindowProc来为视窗消息处理程式不予处理的所有消息提供内定处理,这是很重要的。

不然一般动作,如终止程式,将不会正常执行。

9.WINDOWS程序设计的难点

视窗消息处理程序与视窗类别相关,视窗类别是程式呼叫RegisterClass注册的。

依据该类别建立的视窗使用这个视窗消息处理程式来处理视窗的所有消息。

Windows通过呼叫视窗消息处理程式对视窗发送消息。

第一次建立视窗、关闭视窗、在视窗里进行一系列操作时,window呼叫WndProc。

所有这些呼叫都以消息的形式进行。

Window可以发送给视窗消息处理程序的消息通常都以WM开头的名字标示,都在WINUSER.H中定义。

第四章输出文字

1.绘制和更新

在文字模式环境下,程序可以在显示器的任意部分输出,程序输出到萤幕上的内容会停留在原处,不会神秘地消失。

因此,程序可以丢掉重新生成萤幕显示时所需的资讯。

在window中,只能在视窗的显示区域绘制文字和图形,并且不能确保在显示区域内显示的内容会一直保留到程序下一次有意的改写它时还保留在原处。

Windows通过发送WM_PAINT消息通知视窗消息处理程式,视窗的部分显示区域需要绘制。

如果在视窗消息处理程序处理WM_PAINT消息之前显示区域中的另一个区域变为无效,则Windows计算出一个包围两个区域的新的无效区域(以及一个新的无效矩形),并将这种变化後的资讯放在绘制资讯结构中。

Windows不会将多个WM_PAINT消息都放在消息伫列中。

视窗消息处理程序可以通过呼叫InvalidateRect使显示区域内的矩形无效。

如果消息伫列中已经包含一个WM_PAINT消息,Windows将计算出新的无效矩形。

否则,它将一个新的WM_PAINT消息放入消息伫列中。

在接收到WM_PAINT消息时,视窗消息处理程序可以取得无效矩形的座标(我们马上就会看到这一点)。

通过呼叫GetUpdateRect,可以在任何时候取得这些座标。

在处理WM_PAINT消息处理期间,视窗消息处理程序在呼叫了BeginPaint

之後,整个显示区域即变为有效。

程序也可以通过呼叫ValidateRect函式使显示区域内的任意矩形区域变为有效。

如果这呼叫具有令整个无效区域变为有效的效果,则目前伫列中的任何WM_PAINT消息都将被删除。

TheInvalidateRectfunctionaddsarectangletothespecifiedwindow'supdateregion.Theupdateregionrepresentstheportionofthewindow'sclientareathatmustberedrawn.

BOOLInvalidateRect(

HWNDhWnd,//handletowindow窗口句柄

CONSTRECT*lpRect,//rectanglecoordinates相匹配的区域

BOOLbErase//erasestate

);

该呼叫在BeginPaint呼叫之前进行,它使整个显示区域变为无效,并擦除背景。

但是,如果最後一个参数等於FALSE,则不擦除背景,原有的东西将保留在原处。

2.GDI简介

要在视窗的显示区域绘图,可以使用window的图形装置介面(GDI)。

其提供了几个函数用于将字符串输出到视窗的显示区域内。

TextOut(hdc,x,y,psText,iLength);

TextOut向视窗的显示区域写入字串。

psText参数是指向字串的指标,iLength是字串的长度。

x和y参数定义了字串在显示区域的开始位置。

hdc参数是绘图的句柄,它是GDI的重要部分。

实际上,每个GDI函数都需要将这个句柄作为函数的第一个参数。

程序必须在处理单个消息处理期间取得和释放句柄。

除了呼叫CreateDC建立的装置内容之外,程序不能在两个消息之间保存其他装置内容句柄。

Window应用程序一般用两种方法取得设备内容的句柄,以备在屏幕上绘图。

方法一:

在处理WM_PAINT消息时,使用此方法。

视窗消息处理程序首先呼叫BenginPaint函数,一般在准备绘制时导致无效区域的背景被擦除。

传回的是内容的句柄,通常被保存在叫做hdc的变量中(HDChdc)最后呼叫EndPaint释放句柄。

处理WM_PAINT消息的形式如下:

caseWM_PAINT:

hdc=BeginPaint(hwnd,&ps);

EndPaint(hwnd,&ps);

return0;

在处理WM_PAINT消息时,必须成对地呼叫BeginPaint和EndPaint。

如果视窗讯息处理程式不处理WM_PAINT讯息,则它必须将WM_PAINT讯息传递给Windows中DefWindowProc(内定视窗消息处理程式)。

DefWindowProc以下列

代码处理WM_PAINT消息:

caseWM_PAINT:

BeginPaint(hwnd,&ps);

EndPaint(hwnd,&ps);

return0;

Windows将一个WM_PAINT消息放到消息对列中,是因为显示区域的一部分无效。

如果不呼叫BeginPaint和EndPaint(或者ValidateRect),则Windows不会使该区域变为有效。

相反,Windows将发送另一个WM_PAINT消息,且一直发送下去

PAINTSTRUCT结构体:

window为每个视窗都保存了一个该结构体。

typedefstructtagPAINTSTRUCT

{

HDChdc;

BOOLfErase;

RECTrcPaint;

BOOLfRestore;

BOOLfIncUpdate;

BYTErgbReserved[32];

}PAINTSTRUCT;

程序呼叫BeginPaint时,window会适当填入该结构的各个参数值,使用者程序只使用前三个参数,其他的由window内部使用。

方法二:

要得到视窗显示区域的句柄,可以呼叫GetDC来取得,在使用完后呼叫ReleaseDC:

hdc=GetDC(hwnd);

ReleaseDC(hwnd,hdc);

与BeginPaint和EndPaint一样,GetDC和ReleaseDC函式必须成对地使用。

如果在处理某消息时呼叫GetDC,则必须在退出视窗消息处理程序之前呼叫ReleaseDC。

不要在一个消息中呼叫GetDC却在另一个消息呼叫ReleaseDC。

与从BeginPaint传回句柄不同,GetDC传回的句柄具有一个剪取矩形,它等於整个显示区域。

可以在显示区域的某一部分绘图,而不只是在无效矩形上绘图(如果确实存在无效矩形)。

与BeginPaint不同,GetDC不会使任何无效区域变为有效。

如果需要使整个显示区域有效,可以呼叫

ValidateRect(hwnd,NULL);

一般可以呼叫GetDC和ReleaseDC来对键盘消息(如在字处理程式中)和滑鼠消息(如在画图程式中)作出反应。

此时,程序可以立刻根据使用者的键盘或滑鼠输入来更新显示区域,而不需要考虑为了视窗的无效区域而使用WM_PAINT消息。

不过,一旦确实收到了WM_PAINT消息,程序就必须要收集足够

的资讯後才能更新显示。

与GetDC相似的函数式是GetWindowDC。

GetDC传回用於写入视窗显示区域的

句柄,而GetWindowDC传回写入整个视窗的装置内容代号。

例如,您的程式可以使用从GetWindowDC传回的句柄在视窗的标题列上写入文字。

然而,程式同样也应该处理WM_NCPAINT消息。

3.字体大小

程序可以呼叫GetSystemMetrics函数以取各类视觉字体大小的信息,呼叫GetTextMetrics取得字体大小。

GetTextMetrics传回装置内容中,目前选取的字体资讯,因此它需要装置内容代号。

Windows将文字大小的不同值复制到在WINGDI.H中定义的TEXTMETRIC型态的结构中。

TEXTMETRIC结构有20

个栏位,我们只使用前七个:

typedefstructtagTEXTMETRIC{

LONGtmHeight;

LONGtmAscent;

LONGtmDescent;

LONGtmInternalLeading;

LONGtmExternalLeading;

LONGtmAveCharWidth;

LONGtmMaxCharWidth;

LONGtmWeight;

LONGtmOverhang;

LONGtmDigitizedAspectX;

LONGtmDigitizedAspectY;

TCHARtmFirstChar;

TCHARtmLastChar;

TCHARtmDefaultChar;

TCHARtmBreakChar;

BYTEtmItalic;

BYTEtmUnderlined;

BYTEtmStruckOut;

BYTEtmPitchAndFamily;

BYTEtmCharSet;

}TEXTMETRIC,*PTEXTMETRIC;

TEXTMETRIC结构提供了关于选用的字体的所有信息。

最重要的值是tmHeight,它是tmAscent和tmDescent的和。

这两个值表示了基准线上下字元的最大纵向高度。

包括一个不包含在tmHeight值中的参数tmExternalLeading,它是字体设计者建议加在横向字元之间的空间大小,和tmInternalLeading都设为0。

包含有描述字体宽度的两个参数,即tmAveCharWidth(小写字母加权平均宽度)和tmMaxCharWidth(字体中最宽字元的宽度)。

注意:

大写字母的平均宽度,这可以用tmAveCharWidth乘以150%大致计算出来。

要使用GetTextMetrics函数,需要先定义一个结构变量(通常称为tm):

TEXTMETRICtm;

在需要确定文字大小时,先取得句柄,再呼叫GetTextMetrics:

hdc=GetDC(hwnd);

GetTextMetrics(hdc,&tm);

ReleaseDC(hwnd,hdc);

此后,您就可以查看文字尺寸结构中的值,并有可能保存其中的一些以备将来使用。

4.垂直滚动条、水平滚动条

其实很容易实现此功能,只要程序员在CreateWindow的第三个参数中包括视窗样式WS_VSCROLL(垂直滚动)和WS_HSCROLL(水平滚动)即可。

滚动条的范围和位置:

内定情况下其范围是从0至100,要想改变其范围,程序员可以调用如下函数

SetScrollRange(hwnd,iBar,iMin,iMax,bRedraw)

参数iBar为SB_VERT或者SB_HORZ,iMax和iMin分别是最大值和最小值,如果要windo

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1