WIN32桌面应用开发整理


这学期学的玩意,感觉都已经没什么人在用了,稍微记一下吧

WM_PAINT消息产生机制
  • 各种刷新操作
  • 清除消息框和对话框
数据类型

p57 表2-6

p58 表2-7(字符串与对应操作)

常用函数

通用获取设备环境(两种),映射模式

HDC hdc;
PAINTSTRUCT ps;

//仅WM_PAINT消息下使用
hdc=BeginPaint(hwnd,&ps);
SetMapMode(hdc,MM_TEXT);
EedPaint(hwnd,&ps);
//非WM_PAINT下使用
hdc=GetDC(hwnd);
ReleaseDC(hwnd,hdc);

刷新

InvalidateRect(hwnd,NULL,TRUE);//(hwnd,NULL,是否擦除原背景)

获取窗口坐标(中心)

RECT r1;
GetClientRect(hwnd,&r1);

计时器

SetTimer(hwnd,1,300,NULL);//(hwnd,计时器ID,间隔时间ms,NULL)
KillTimer(hwnd,1);//(hwnd,计时器ID)

消息框

Message(hwnd,文本,标题,MB_OK);
画笔画刷步骤
  • 获取设备环境,设置映射模式
  • 创建画笔
  • 选入设备环境
  • 调用绘图函数 P75
//定义写在消息循环开头
HPEN hp;
HBRUSH hb;

//获取设备环境,设置映射模式
//调用系统画笔
hp=(HPEN)GetStockObject(BLACK_PEN);//其他颜色 P73
hb=(HBRUSH)GetStockObject(BLACK_BRUSH);//其他样式P74
//自定义画笔 P73
//自定义画刷 p74
SelectObject(hdc,hp);
SelectObject(hdc,hb);
//调用函数
文本
//定义在循环开头
HFONT hf;
TEXTMETRIC tm;
SIZE size;//size中保存了字符串的宽度和高度
  • 创建句柄
  • 调用系统默认或自定义
  • 选入设备环境
  • 设置字体颜色和背景颜色
//若使用默认的字体,可以跳过调用以及选入设备步骤
//若自定义 P103
//选入设备
SelectObject(hdc,hf);
//设置颜色
SetTextColor(hdc,RGB(0,0,0));
SetBKColor(hdc,RGB(0,0,0));
文本输出
  • 获取字体信息
  • 格式化文本(帮助确定后续坐标)
  • 输出 P113 输出字符串中某一个字符
GetTextMetrics(hdc,&tm);//获取信息
GetTextEXtentPoint32(hdc,字符串,字长,&size);//格式化
TextOut(hdc,x,y,字符串,字节数);//可以通过控制字节数来控制输出不同长度
键盘

WM_KEYDOWN 类型 虚拟码 P129

case WM_KEYDOWN:
{
    switch(wparam)
    {
        case VK_CONTROL:
            //语句
            break;
        case VK_SHIFT:
            //语句
            break;
        default:
            break;
    }  
}

WM_CHAR类型 P134

鼠标

各种鼠标消息(左键、右键、双击、鼠标移动等)P142

case WM_LBUTTONDOWN:
	...
	break;

同时检测同时按下Ctrl 、shift等键

case WM_LBUTTONDOWN:
    if(wparam & MK_CONTROL)//要让wpara & MK值
        ...
    break;

获取鼠标位置,鼠标移动时会一直发出WM_MOUSEMOVE消息,因此每次消息循环都会重新读取鼠标位置

//point结构体,包含 x、y两个成员,定义在循环开头
POINT pt;
GetCursorPos(&pt);//随时获取鼠标位置(相对于桌面)
ScreenToClient(hwnd,&pt);
x=pt.x; y=pt.y;
//注意,必须要写在消息循环开头,不然可能读取错误
mouse_x=LOWORD(lparam);
mouse_y=HIWORD(lparam);
case WM_MOUSEMOVE:
	x=mouse_x;
	y=mouse_y;
	invalidaterect();//刷新
	break;
菜单

获得菜单句柄,要想对菜单进行操作要先获得句柄

HMENU hmenu;
hmenu Getmenu(hwnd);

重绘菜单

DrawMenuBar(hwnd);//约等于刷新,所有更改菜单的操作后面最好都要加一句

子菜单句柄获取

// GetSubMenu(父菜单句柄, 子菜单位置 );
HMENU hmsub = GetSubMenu(hm, 1 );

禁止或激活菜单项

//后两项参数见 P161 表6-3
EnableMenuItem(hmenu,标识:ID号或者位置,标识方式|状态);

设置或取消选中菜单项

CheckMenuItem(hemu,标识:ID号或者位置,标识方式|状态);//参数见P162

删除菜单项

DeleteMenu(hmenu,ID_save,MF_BYCOMMAND)//根据ID删即可

修改菜单项名称

ModdifyMenu(hmenu,"要修改的菜单项ID",MF_BYCOMMAND,"新ID","新名称");

增加菜单项分隔符(这个方法时可以添加子菜单的,但是无法在创建子菜单的同时为子菜单添加菜单项)

AppendMenu(子菜单句柄,状态,标识:ID号或者位置,名称)
//增加菜单项“颜色”
AppendMenu(hmsub,MF_ENABLED,IDM_COLOR,"颜色");
//增加分隔符
AppendMenu(hmsub,MF_SEPARATOR,NULL,NULL);

特定位置之前插入菜单项 P163

菜单或子菜单句柄
InsertMenu(hmenu,位置或别的菜单项ID,标识方式|状态,菜单项ID, "名称");

动态添加菜单

HMENU hm = GetMenu(hWnd);
//创建新菜单句柄
HMENU haddmenu = CreateMenu();
//为新菜单添加菜单项         
AppendMenu(haddmenu, MF_ENABLED, ID_COLOR_RED, "红色");
//用AppendMenu或InsertMenu添加到主菜单,并命名
InsertMenu(hm, 2, MF_POPUP | MF_BYPOSITION, (UINT)haddmenu, "名称");               
DrawMenuBar(hWnd);
位图
  	static HDC hdcmem; 
   	static  HBITMAP hbm; 
    //获取位图尺寸
    static BITMAP bm;
case WM_CREATE:
    {
        //这一段代码通用
        hbm = LoadBitmap(hInst, MAKEINTRESOURCE(位图ID));//makeinyresouce可能报错,不用管
        HDC hdc = GetDC(hWnd);
        hdcmem = CreateCompatibleDC(hdc); 
        //获取位图尺寸,必写
        GetObject(hbm, sizeof(BITMAP), (LPVOID)&bm);
        ReleaseDC(hWnd, hdc);
    }
    break;
case WM_PAINT:
{
    //选入设备环境
    SelectObject(hdcmem, hbm);
    //选择一个函数
    BitBlt() P172 or StretchBlt() P174;
}
对话框

两种对话框创建和关闭的方式各自成对应

模态对话框需要将属性visible改为TRUE

//模态对话框创建和关闭
//对话框处理函数要在文件头部声明
DialogBox(hInst,MAKEINTRESOURCE(对话框ID),hwnd,对话框处理函数);
EndDialog(hdlg,0);
//非模态对话框需要在消息循环进行处理
while (GetMessage(&msg, nullptr, 0, 0))
    {
    //========加上这部分=================
    	if (!IsDialogMessage(hdlg,&msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    //====================================
    }
//创建与关闭
CreateDialog(hInst,MAKEINTRESOURCE(对话框ID),hwnd,对话框处理函数);
DestroyWindow(hdlg);

/加上这部分=========
if (!IsDialogMessage(hdlg,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//====================================
}
//创建与关闭
CreateDialog(hInst,MAKEINTRESOURCE(对话框ID),hwnd,对话框处理函数);
DestroyWindow(hdlg);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值