编程高手进!关于自绘按纽问题

纯API工程————————//创建按纽函数voidUI(HWNDhwnd){//按纽窗口CreateWindow(TEXT("button"),NULL,WS_CHIL... 纯API工程————————
//创建按纽函数
void UI(HWND hwnd)
{
//按纽窗口
CreateWindow(
TEXT("button"),
NULL,
WS_CHILD|WS_VISIBLE|BS_OWNERDRAW,
0,0,
400,260,
hwnd,
(HMENU)ID_GUANYU,
hInst,
NULL);
return;
}

//处理自绘消息——————————-这是case WM_DRAWITEM:消息里面的
void DrawButton(LPARAM lParam,HWND hwnd)
{
HDC hdc;
LPDRAWITEMSTRUCT pdis;
HPEN hpen;

pdis = (LPDRAWITEMSTRUCT)lParam; //包含自绘信息的结构体
hdc = pdis->hDC;
hpen = CreatePen(PS_SOLID,1,RGB(255,100,1));
SelectObject(hdc,hpen);
switch ( pdis->CtlID )
{
case ID_GUANYU:
SendMessage(pdis->hwndItem,WM_ERASEBKGND,(WPARAM)pdis->hDC,NULL);
if ( pdis->itemState & ODS_SELECTED )
{
MoveToEx(hdc,133,155,NULL);
LineTo(hdc,1,25);
LineTo(hdc,25,25);
LineTo(hdc,132,155);
MoveToEx(hdc,12,3,NULL);
LineTo(hdc,2,24);
}
else
{
MoveToEx(hdc,12,1,NULL);
LineTo(hdc,1,24);
LineTo(hdc,24,24);
LineTo(hdc,12,1);
MoveToEx(hdc,13,2,NULL);
LineTo(hdc,25,25);
LineTo(hdc,2,25);
//BitBlt(hdc, 0, 0, bmp1.bmWidth, bmp1.bmHeight, hMemDC1, 0, 0, SRCCOPY);
}
break;
}
return ;
}
按下或释放我已经可以画线了。。。。。
请问怎么绘图资源里的BMP格式图片比如BMP标识ID_BMP
我只知道画图要在case WM_PAINT里面在这个函数里面不会绘 请高手解答下!
展开
 我来答
eachdoor
推荐于2016-12-06 · TA获得超过817个赞
知道小有建树答主
回答量:310
采纳率:0%
帮助的人:283万
展开全部
楼主您好
如果是mfc,那么首先将Button的own drew 属性设为true,然后在BOOL CMyDlg::OnInitDialog()加入代码:

((CBitmapButton *)GetDlgItem(IDC_min))->LoadBitmaps(IDB_BITMAP4);
((CBitmapButton *)GetDlgItem(IDC_BUTTON1))->LoadBitmaps(IDB_BITMAP1);

-----------------------------------------------------------------
api详解:

需为按钮定义一个基于CBitmapButton类的对象,
然后调用CBitmapButton类的成员函数CBitmapButton::LoadBitmaps()即可为按
钮添加背景图片,而且最多同时可以最多可包括4个位图,分别代表按钮所处的不
同状态:未按下(或正常)、按下(或选中)、获得焦点和被禁止存取。只有第
一个位图是必须的,其它三个可以不提供。
如在个关闭按钮添加位图时,需先通过类向导为关闭按钮添加一个CBUTTON类的对
象m_Close,而不能直接添加CBitmapButton类对象m_Close,因为类向导内变量选项
中没有CBitmapButton类选项,解决的方法就是到头文件中定义对话框对象的部分
将“CButton m_Close;”改为“CBitmapButton m_Close”然后便可通过对象
m_Close调用LoadBitmaps()函数来为按钮设置图片背景。例如:
m_Close.LoadBitmaps(IDB_BMP_CLOSE,IDB_BMP_CLOSEOVER);

相关知识点:

BitmapButton

CObject
└CCmdTarget
└CWnd
└CButton
└CBitmapButton

类CBitmapButton用于创建用位图而不是文本做标签的按钮控件。CBitmapButton对象
最多可包括4个位图,分别代表按钮所处的不同状态:未按下(或正常)、按下
(或选中)、获得焦点和被禁止存取。只有第一个位图是必须的,其它三个可以不提供。
位图按钮图像包括图像本身以及图像的边框。边框在表示按钮的不同状态时很有用。
例如,按钮获得焦点时的位图与未按下(或正常)状态的位图相同,但是在边框中要
么嵌入了由间断线组成的矩形,要么嵌入了由粗实线组成的矩形。禁止存取状态的按钮
的位图通常和正常状态的一样,但是颜色的对比度较小,就象变灰的菜单选项一样。
这些位图的尺寸可以不同,但都当成和正常状态下位图一样的大小处理。
不同的应用对位图有不同的组合应用。如下所示: 未按下 按下 获得焦点 禁止存取 应用
ⅹ 类Bitmap
ⅹ ⅹ 没有设置WS_TABSTOP的按钮
ⅹ ⅹ ⅹ ⅹ 带有所有状态的对话框按钮
ⅹ ⅹ ⅹ 设置WS_TABSTOP风格的对话框按钮

2008-6-14 11:37 回复

lizhongjun1984
1位粉丝
2楼

在创建一个位图按钮控件时,设置BS_OWNERDRAW则指明按钮是自定义的(用户自己绘制的)。
这样,Windows就会为该按钮发送WM_MEASUREITEM和WM_DRAWITEM消息,由框架处理这些消
息并维护按钮的外观。
在窗口的客户区创建一个位图按钮的步骤如下: 1. 为按钮创建1到4个位图。
2. 构造CBitmapButton对象。
3. 调用Create函数创建Windows按钮控件,并把它加到CBitmapButton对象上。
4. 调用成员函数LoadBitmaps加载位图资源。
在对话框控件中包含位图按钮的步骤如下: 1. 为按钮创建1到4个位图。
2. 创建一个对话框模板,其中有一个自定义的按钮放在需要位图按钮的位置。模板中按钮的大小无关紧要。
3. 把按钮的标题设置为“MYIMAGE”一类的字符串,并为按钮定义一个类似于IDC_MYIMAGE的代号。
4. 在应用的资源脚本中,分别为每个给该按钮创建的图像一个ID,ID的值为在步骤3中的标题后加上
如下的一个字母——U、D、F或X,分别代表正常、按下、获得焦点和禁止存取状态下的按钮。例如
,标题设为“MYIMAGE”时,ID就应该是字符串("MYIMAGEU"、"MYIMAGED"、"MYIMAGEF"和"MYIMAGEX")。
位图的ID必须用引号括起来,否则资源编辑器就会为资源赋上一个整数值,MFC在加载图像时就会失败。
5. 在应用的对话框类(从类CDialog继承而来)中加上一个CBitmapButton成员对象。
6. 在CDialog对象的OnInitDialog例程中调用CBitmapButton对象的AutoLoad函数,参数是按钮的
ID和CDialog对象的this指针。
如果想处理Windows的通知消息,如位图按钮控件发给它的父对象(通常是从CDialog继承来的)
的BN_CLICKED消息,就要在从CDialog继承来的对象中加入消息映射入口以及处理每个消息的成员函数。
CBitmapButton对象发出的通知和CButton对象发出的通知一样。
类CToolBar对位图对象的实现有些不同。
要了解有关CBitmapButton的更详细信息,请参阅联机文档“Visual C++程序员指南”的“控件主题”部分。
#include <afxext.h>

CBitmapButton类的成员

构造函数 CBitmapButton 构造一个CBitmapButton对象
LoadBitmaps 从应用的资源文件中加载一个或多个命名的位图初始化对象,并把位图加到对象上
AutoLoad 把对话框中的一个按钮与一个CBitmapButton对象联系上,加载位图并调整按钮的大小以放下位图

操作 SizeToContent 调整按钮的大小以放下整个位图

共同努力
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式