windows程序设计笔记

  • WINAPI标识符在WINDEF.H中定义:

    define WINAPI __stdcall

    该语句制订了一个调用约定,包括如何生成机器代码以及在堆栈中放置函数调用的参数,
    1:1)在Win32API中,长指针和短(近)指针是没有区别的,这只是16位Windows的遗物

    2):wndclass.lpfnWndProc=WndProc;
    这条语句将这个窗口类类的窗口过程设置为WndProc,这个过程将处理基于这个窗口类创建的所有
    窗口的全部消息,在c语言中,像这样在语句中使用函数名时,实际引用提供的是指向函数的指针

    3): 下面两个域用于在类结构和Windows内部保存的窗口结构中预留一些额外空间(一般为0)
    wndclass.cbClsExtra=0;
    wndclass.cbWndExtra=0;

    4):一条历史性的经验:在windows示例程序中,可能在WinMain中看到以下代码:
    if(!hPrevInstance)
    {
    wndclass.cbStyle=CS_HREDRAW|CS_VREDRAW;
    [other wndclass initialization]
    RegisterClass(&wndclass);

      在32位的Windows中,hPrevInstance总是NULL
    

    2: 对于windows程序,如过不想要某个功能,可以取反后在做与操作,例如:

    HWND hwnd;
    hwnd = CreateWindow(“Lanbo”, “我的第一个窗口程序”,
    WS_OVERLAPPEDWINDOW&~WS_MINIMIZEBOX, 280, 240, 600, 400, NULL, NULL, hInstance, NULL);

!!!!!!!
3:当窗口大小改变时,windows会给窗口过程发送一个WM_SIZE消息,传给窗口过程的lParam参数的低位字中
包含客户区的宽度,高位字中包含客户区的高度。可以定义两个静态变量保存这些尺寸
static int cxClient,cyClient; //c表示count,即像素数
处理WM_SIZE时:
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
char szChar1[50];
sprintf_s(szChar1,”cxClient=%d,cyClient=%d”, cxClient, cyClient);
HDC hdc3;
hdc3 = GetDC(hwnd);
TextOut(hdc3, 0, 20, szChar1, strlen(szChar1));
ReleaseDC(hwnd, hdc3);
break;
最好不要用MessageBox弹出对话框,因为当要用鼠标改变窗口大小时,就会弹出对话框,结果大小改变不

4:滚动条
只需在CreateWindow的第三个参数加上WS_VSCROLL就可以加上垂直滚动条了,水平滚动条是WS_HSCROLL
WS_OVERLAPPEDWINDOW|WS_VSCROLL

 SetScrollRange(),SetScrollPos(),GetScrollRange(),GetScrollPos()
虽然这四个函数时“过时”的,但它们仍然具有良好的功能,而且不与新函数冲突,
 Win32 API介绍的两个滚动条函数是SetScrollInso和GetScrollInfo,这两个函数可以完成之前4个函数的
 全部功能,并且增加了两个新特性
 wParam消息参数被分为一个低位字和一个高位字。其低位字是一个数值,它指出了鼠标对滚动条进行的操    作,这个数值被看作一个通知码(例如SB_LINEUP....等,SB表示Scroll Bar)(详细信息看windows程序设计
92页)
 对于滚动条,以下是程序员要做的事:
  *初始化滚动条的范围和位置;
  *处理窗口过程的滚动条消息;
  *更新滚动框内滚动条的位置;
  *更新客户区的内容以响应对滚动条的更改

5: 图形输出设备分为两大类:光栅设备和矢量设备,大部分pc的输出设备时光栅设备,这意味着它们以点模式
来表示图像,这类设备包括视频显示适配器,点阵打印机和激光打印机;设量设备使用线来绘制图像,通常
局限于绘图仪

//=====================================各种消息的wParam和lParam消息=====================================================
6:wParam和lparam
1)WM_SIZE;
lParam的低位字是客户区的宽度,高位字是客户区的高度
2)WM_VSCROLL和WM_HSCROLL:
wParam的低位字是SB_LINEUP,SB_PAGEDOWN….等消息,当消息为SB_THUMBPOSITION时,wParam的高位字
时释放鼠标按键时滚动条的位置,即拖动后的最终位置
3)WM_LBUTTONDOWN,WM_RBUTTONDOWN和WM_MOUSEMOVE:
wParam的值是指示鼠标键及Shift和Ctrl键的状态
lParam的低位字是光标的当前位置的x坐标,高位字是y坐标
(值得注意的是:非客户区(在窗口的客户区外但还在窗口内,包括标题栏,菜单和窗口滚动条)鼠标消息
的wParam和lParam参数有一定的差别,wParam参数指明移动或单击鼠标键的非客户区位置,它设置为
WINUSER.H中定义的以HT开头的标识符之一(HT表示“命中测试”),lParam参数包含低位字的x坐标和高 位字的y坐标,但是,它们都是屏幕坐标,而不是客户区坐标)
4) WM_CHAR:
wParam是所按下的键的ASCII码
5) WM_DISPLAYCHANGE:
当显示器的分辨率改变后,此窗口过程会接到WM_DISPLAYCHANGE消息
wParam参数为显示设备新的颜色深度,即每个像素所占的颜色位数
lParam参数的低字节部分为显示设备新的水平分辨率,高字节部分为显示设备的新的垂直分辨率。
6) WM_INPUTLANGCHANGE:
当应用程序的输入法法伤变化时,WM_INPUTLANGCHANGE消息发送给最顶端的受影响窗口
wParam: 该输入法使用的字符集
lParam: 该输入法的HKL(KeyboardLayout–键盘布局,也被称为Input Local Identifier–输入区域标
识)
7)WM_KEYDOWN
其中wParam 指定非系统键的虚拟键码, lParam 指定重复次数,扫描码,扩展键标识符,上下文代码, 前一键状态标识符,以及转换状态标识符.

8) WM_CREATE
子窗口创建过程中有:
hwndButton[i] = CreateWindow(TEXT(“button”), button[i].szText, WS_CHILD | WS_VISIBLE | button[i].iStyle,cxChar, cyChar*(1 + 2 * i), 20 * cxChar, 7 * cyChar / 4, hwnd, (HMENU)i, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
其中CreateWindow调用的实例句柄看起来有些奇怪,但是它利用了如下事实,即在处理WM_CREATE消息
的过程中,lParam实际上是指向CREATESTRUCT结构的指针,该结构有一个hInstance成员。所以将lParam
转换成指向CREATESTRUCT结构的一个指针,并取出hInstance;(有些Windows程序使用名为hInst的全局 变量,使窗口过程能访问WinMain中的实例句柄)
也可以用 GetWindowLong获取实例句柄
GetWindowLong(hwnd,GWL_HINSTANCE);

 9)WM_COMMAND
   当子窗口向父窗口发送WM_COMMAND消息时,各参数含义如下:
    LOWORD(wParam)     子窗口ID
    HIWORD(wParam)     通知码
    lParam             子窗口句柄
                按钮通知码标识符
    * User Button Notification Codes
    */
#define BN_CLICKED          0
#define BN_PAINT            1
#define BN_HILITE           2
#define BN_UNHILITE         3
#define BN_DISABLE          4
#define BN_DOUBLECLICKED    5
#if(WINVER >= 0x0400)
#define BN_PUSHED           BN_HILITE
#define BN_UNPUSHED         BN_UNHILITE
#define BN_DBLCLK           BN_DOUBLECLICKED
#define BN_SETFOCUS         6
#define BN_KILLFOCUS        7
#endif /* WINVER >= 0x0400 */

  10)WM_CTLCOLORBTN
     当父窗口过程收到WM_CTLCOLORBTN消息时,wParam消息时按钮的设备描述表句柄,lParam是按钮的
     窗口句柄;当你的窗口过程处理一个WM_CTLCOLORBTN消息时,你必须完成如下三个动作:
      *使用SetTextColor有选择的设置一种文本颜色
      *使用SetBkColor有选择的设置一种文本背景颜色
      *将一个画刷句柄返回给子窗口

  11)WM_DRAWITEM
      在处理WM_DRAWITEM消息期间,lParam消息参数是指向类型DRAWITEMSTRUCT结构的指针,OWNERDRAW程序将这个指针保存在pdis变量中,这个结构包含了画该按钮时程序所必须的消         息(这个结构也可以为自绘列表框和菜单所使用)。对按钮而言非常重要的结构域有hDC(按钮的设备描述表),rcItem(提供按钮尺寸的RECT结构),ctlID(控制窗口的ID)和itemState(它       说明按钮是否被按下或者是否拥有输入焦点)
   如果按钮当前被按下,那么DRAWITEMSTRUCT的itemState域中的某位被置位。你可以使用0DS_SELECTED常量来测试这些位。如果按钮拥有输入焦点,那么itemState的ODS_FOCUS位将被       置位

//==============================================================================================================================

7:变量ps是类型为PAINTSTRUCT的结构,该结构的hdc字段是BeginPaint返回的设备描述表句柄;PAINTSTRUCT结 构又包含一个窗口客户区无效范围的矩形。使用从BeginPaint获得的设备描述表句柄,只能在这个区域内绘 图,GetDC,ReleaseDC与BeginPaint和EndPaint的组合之间的基本区别是,利用从Getdc返回的句柄可以在整 个客户区上绘图,当然,不能使客户区中任何可能的无效区域变成有效
Windows程序还可以获取适用于整个窗口(而不仅限于窗口的客户区)的设备描述表句柄:
hdc=GetWindowDC(hwnd);
[other program lines]
ReleaseDC(hwnd,dc);
ps:这个函数很少用,如果想使用它,必须捕获WM_NCPAINT(非客户区绘制)消息,Windows使用该消息在窗口 的非客户区上绘图
还有CreateDc,CreateCompatibleDC,DeleteDC等函数

8: 保存设备描述表:
如果想要在释放设备描述表之后,仍然保存程序中对设备描述表属性所做的改变,以便下次调用GetDC和
BeginPaint时它们任然起作用,为此,可在登录窗口类时,将CS_OWNDC标志包含为窗口类的一部分
wndclass.style=CS_HREDRAW|CS_VREDRAW|OWNDC;
现在,基于这个窗口类所创建的每个窗口都将拥有自己的设备描述表,它一直存在,直到窗口被删除,使用 了该标志,就只需初始化设备描述表一次,可以在处理WM_CREATE消息期间完成这一操作
case WM_CREATE;
hdc=GetDC(hwnd);
//Initialize device context attributes
ReleaseDC(hwnd,hdc);
return 0;

在某些情况下,可能想改变某些设备描述表属性,用改变之后的属性进行绘图,然后恢复原来的设备描述表,
要简化这一过程,可以通过如下调用来保存设备描述表的状态,
idSaved=SaveDC(hdc);
现在可以改变一些属性,在想要回到调用SaveDC之前存在的设备描述表时,调用:
RestoreDC(hdc,idSaved);
可以在调用RestoreDc之前调用SaveDC数次
如果调用RestoreDc(hdc,-1);则将设备描述表恢复到最近有SaveDC函数保存的状态中

9:画图
*画直线:画一条直线,必须调用两个函数,第一个指定线的开始点,第二个指定了线的终点;
MoveToEx(hd

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值