登录后没有弹窗广告,广告是为了发展.如果您在未注册情况下浏览书部落弹出了广告,感谢您对书部落运营的支持
游客: 注册 | 登录 | 统计 | 赚部落币! | 论坛规则简介(必看) | 上传书籍必看| C/C++学习小组| | WINDOWS编程学习小组|
= 论坛导航 = 站务交流 · 新闻与评论 · 找书·评书·荐书 人生故事·心得分享 学习经验·答疑解惑 精华
[电子书分享专区] WEB开发与程序设计 ·C/C++电子书 ·JAVA电子书 ·.NET相关 ·汇编语言 ·PHP电子书 ·ASP电子书 ·JSP电子书 · 嵌入式开发 ·游戏编程 黑客|病毒|破解 ·Ruby·Ajax·XML·CSS·Python等脚本语言                              ·操作系统 ·LINUX电子书 ·UNINX电子书 ·WINDOWS电子书 ·数据库 ·Oracle ·MYSQL ·SQL Server ·等....                  注:书籍分享区仅限书籍分享,下面有代码分享区,希望大家注意区分
[程序源代码分享区] Windows程序(C/C++/VC++) ·界面编程 ·桌面应用 ·文件操作 · shell编程 ·钩子(HOOK) ·Win32API ·COM编程 ·进程与线程 ·驱动编程 ·WinSock ·LINUX程序代码 ·JAVA程序 ·.NET编程 ·书籍源码 ·等....
[ 技术文摘分享区] 文摘分享区旨在搜集网上的专业文献,希望你也能来添砖加瓦,添加文章有部落币奖励
程序设计与WEB开发电子书目录◇◆□ 专题推荐:JAVA电子书下载◇◆□ C程序设计之四书五经_电子书下载◇◆□ C++学习推荐书目◇◆□ C#经典书籍◇◆□ JAVA编程思想专题◇◆□ C++ Primer
↑请善于搜索-“搜商”是21世纪您成功的关键因素



 
标题: [Visual C++] 用 Win API 实现自绘按钮类
程序源代码
超级版主
Rank: 8Rank: 8



UID 64740
精华 0
积分 2
帖子 118
威望 2
部落币 926
代码量 52
阅读权限 150
注册 2007-12-20
状态 离线
发表于 2007-12-26 01:33  资料 文集 短消息 

用 Win API 实现自绘按钮类

俗话说佛要金装、人要衣装,作软件的当然得要个好界面啦^_^。网上提供的控件自绘基本上是MFC或WTL封装好的类,对于不想用MFC的人来说是一无是处的,我可是WIN32API的坚决拥护者。因为MFC等也是用WIN32API封装起来的,学好了WIN32API,可以深入的了解WINDOWS内部的机制,编写出来的程序才能得到更好的优化。
+TF G Jv下载电子书下载,计算机电脑教程图书)JA~.\i
[代码性质] VC完整应用程序代码
X!F.l9Zl'O-tM电子书下载,计算机电脑教程图书[代码作者] 颜飞www.shubulo.comIn1p(SMO
[文件大小] 101K


附件: 用 Win API 实现自绘按钮类.rar (2007-12-26 01:33, 99.4 K)
该附件被下载次数 127
如果您对本帖内容有任何质疑,或者您在阅读/下载 本帖内容时遇到困难 请在站务管理版里发帖提出。点这里进入反馈
顶部
程序源代码
超级版主
Rank: 8Rank: 8



UID 64740
精华 0
积分 2
帖子 118
威望 2
部落币 926
代码量 52
阅读权限 150
注册 2007-12-20
状态 离线
发表于 2007-12-26 01:35  资料 文集 短消息 
用 Win API 实现自绘按钮类书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网/FG1r(t/G"Sp
书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网'{!Ka6_
g
d        D

作者:颜飞书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网;r:Q"`i(EP5k dA
iL

书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网hgw
U$E
t4TE`+i

下载源代码
sb-w$bb!S书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网书部落-计算机PDF电子书之家Lsj[1it-s-\
  俗话说佛要金装、人要衣装,作软件的当然得要个好界面啦^_^。网上提供的控件自绘基本上是MFC或WTL封装好的类,对于不想用MFC的人来说是一无是处的,我可是WIN32API的坚决拥护者。因为MFC等也是用WIN32API封装起来的,学好了WIN32API,可以深入的了解WINDOWS内部的机制,编写出来的程序才能得到更好的优化。下载!d:`2L-xo@L
下载.Ww#?q6R
}$y

  下面分析一下自绘按钮的原理,用过MFC自绘按钮的人都知道,是通过重载了父窗口WM_DRAWITEM的响应消息实现的。同时也要子类化按钮来得到按钮的其他有用的消息,比如WM_MOUSEMOVE、WM_KEYDOWN等消息。因为MFC的消息循环都是封装好的,所以只要派生一下基本控件类就可以了。当是用WIN32API做的话就需要自己来子类化按钮窗口的消息循环了,相信经常编程的朋友都知道,子类化控件要用到SetWindowLong来改变窗口的回调过程,然后在回调窗口内添上自己需要处理的消息即可。因为我们要实现自绘按钮所以最好把子类化的过程做成一个类,然后传给它要自绘的按钮句柄就行了。因为要在类里面实现消息回调函数,但是类里面的消息回调函数只能是静态的,所以不能对应每个实例的消息回调。在我实现的按钮子类化类里,我用到Thunk技术或SetProp函数来实现的,具体请网上查找。书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网)tp_S|h1Z
电子书下载,计算机电脑教程图书'l2gE6\'Ji,XZ
  下面我来谈谈自绘按钮里最重要的部分,就是响应按钮消息函数里的WM_PAINT消息,我们所有的自绘动作都在这里进行的。WM_PAINT里的绘图操作与普通窗口的操作一样,但是为了跟踪按钮的当前状态,我们还要响应按钮窗口的WM_MOUSEMOVE、WM_SETFOCUS、WM_KILLFOCUS、WM_LBUTTONDOWN、WM_ENABLE等消息来得到当前按钮的状态。从而在WM_PAINT里面绘出不同的状态,能实现的东西很多可以说你想多少基本就能实现多少^_^,看个人喜好了,我提供源代码大家可以自行修改。我也是参看了ButtonST里面自绘的代码,我自己添加了右键拖动功能,鼠标掠过发生功能大家有兴趣可以自己添加,锻炼一下自己的编程能力^_^。www.shubulo.comK,Z.?&ab(y

9h4_yq        ^L\B电子书下载,计算机电脑教程图书  下面我说一下我做的这个类的一个问题,我把按钮类做成了一个动态库,调用时只要加上我的头文件和连接的lib库就可以了。我的动态库在WIN32的程序加载是没有问题的,但是在MFC里面,必需要响应父窗口的WM_DRAWITEM消息,在里面直接返回,而不要调用MFC默认的处理就OK了。这是因为我没有截获父窗口的WM_DRAWITEM消息,否则在关闭程序时会出现非法操作!主要代码分析如下:#u(Sy6m:Bi(c.u

s-L3J,Z3yMju
\书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网
5tn`Dn
自绘按钮类声明: class DLLPORT CWINButton
]Ej!O
BRqwww.shubulo.com
{电子书下载,计算机电脑教程图书5E)\]bl
public:
m\O~0C9z电子书下载,计算机电脑教程图书        //初始化按钮(这是第一步!)书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网F7R@+D,a8v8Pk|5X1n'R
        BOOL GetItemhWnd(HWND hWnd);
{3{2j5^([^书部落-计算机PDF电子书之家        //还原按钮区域设置
9uKG/n8K:e8^vb书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网        BOOL Restore();
6c}/I        sw0?_        W8{书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网        //设置按钮是否可以拖动
\)x-T4Ya)s        BOOL SetDrag(BOOL Enable);
Db3|B.RE#q ]n书部落-计算机PDF电子书之家        //设置按钮图标电子书下载,计算机电脑教程图书n n ayX)T4a
]

        BOOL SetIcon(HICON icon);
o$F(vg7V/f#YT0CB电子书下载,计算机电脑教程图书        //设置按钮文字电子书下载,计算机电脑教程图书.Nxd1M-C%y,}Q8x
        BOOL SetText(char *text, HFONT font);www.shubulo.com9\
I0o0{0r u%^e0Z

        BOOL SetText(char *text);
&r&t5R!f[7m|电子书下载,计算机电脑教程图书        BOOL SetText(char *text, COLORREF color);www.shubulo.comLy3mG8oT5z
        //设置按钮有效区域
R
B"\L(gi?\ @书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网
        BOOL SetupRegion(COLORREF TransColor);
oXW`EM1z(p/Z下载        LRESULT OnPaint(HDC hdc);
V\|2Fx
Sy@t下载
        //设置按钮无效时的图片www.shubulo.com_8@4D7]Z
        BOOL SetDisablePic(HBITMAP bmp);电子书下载,计算机电脑教程图书2j oda0{"C:e6}
        //设置按钮按下时的图片电子书下载,计算机电脑教程图书w:hdH2z ~
        BOOL SetPressPic(HBITMAP bmp);
-an#KqCIwww.shubulo.com        //设置悬停按钮时的图片下载tr-\9Q0J0F%s
        BOOL SetHoverPic(HBITMAP bmp);电子书下载,计算机电脑教程图书gn(NFm|
        //设置按钮背景图片,第二个参数是是否根据图片调整按钮大小书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网,O6q+D6I F(?
        BOOL SetBackPic(HBITMAP bmp, BOOL bReSize);
st
h*nn        MQ`下载
        //设置按钮的提示消息
8s)Ef(XVG|)f下载        BOOL SetToolTip(char *text);下载O[)^:P4q6J
Y

        CWINButton();电子书下载,计算机电脑教程图书({E }CS.G$dWjdI
        virtual ~CWINButton();
Fb&P%nHwww.shubulo.com       
"?L}`W)n:n-|www.shubulo.comprivate:下载Za
n
iA.O/Yd

        static LRESULT WINAPI stdProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam);下载vto[T
        WNDPROC GetThunk();书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网1p(cJ&h5J3A+Pk&O
        WNDPROC CreateThunk();
-SY5pcdZvpM书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网        LRESULT CALLBACK WINProc(UINT message, WPARAM wParam, LPARAM lParam);书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网;`1bfR%oV*g
        BOOL DrawInsideBorder(HDC dc, RECT *rect);
y"^yEl-mY-kZ/^!p{        BOOL DrawFlat(HDC dc, RECT *rect);书部落-计算机PDF电子书之家        v"O/Pr K_4y@
        BOOL DrawDefault(HDC dc);
g.F|2\;`wN下载        HWND m_ToolTip;
#R5au-U:f.r:UQK书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网        HWND m_hWnd;
-H!nLC        W4W}"`&G        HWND m_hWndParent;
p&O~|t3K m.o书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网        LONG m_OldProc;下载8V d9o+heP4_v;x5k\
        WNDPROC m_thunk;
Y
dl)m1b(Owww.shubulo.com
        TOOLINFO ti;
Z {v7X+N
jG书部落-计算机PDF电子书之家
        HICON m_icon;
#r NJ$sR+R电子书下载,计算机电脑教程图书        HBITMAP m_Back; //按钮背景图片电子书下载,计算机电脑教程图书 Y:m'AZ:f*p8Cr
        HBITMAP m_Hove; //鼠标悬停时按钮背景图片www.shubulo.com$fHcf#Id
        HBITMAP m_Press; //鼠标按下时按钮背景图片
(P:G(k
^@^]电子书下载,计算机电脑教程图书
        HBITMAP m_Disable; //按钮无效时背景图片书部落-计算机PDF电子书之家$r2VK
T^`*xG~

        BITMAP bm;www.shubulo.comCm        g[7t*?_7hG
        COLORREF m_textcolor; //按钮文字的颜色下载'i*CX,c
rDv

        BOOL m_bMouseTracking; //判断鼠标是否在窗口内
sc*|[#xq电子书下载,计算机电脑教程图书        BOOL m_bPress; //判断鼠标是否按下
a!o/Ydv)wYPl,fqwww.shubulo.com        BOOL m_Enable; //控件是否有效下载$|'t;Vw?3nf
        BOOL m_bFocus; //按钮是否处于输入焦点
Xv:L6U6w2`i&U书部落-计算机PDF电子书之家        BOOL m_bOwnerDraw; //判断是否用户自己贴图电子书下载,计算机电脑教程图书'VB)x9Y$n~fF
        BOOL m_bDrag; //是否处于拖动状态
-yk,~A+hl4`3C,b.X,i!xwww.shubulo.com        BOOL m_bDragEnable; //是否允许拖动
!ChRy6{0Yi书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网        char m_text[MAX_TEXTLEN]; //按钮文字电子书下载,计算机电脑教程图书$U&er%f*~
V}2}

        char m_tiptext[MAX_TEXTLEN]; //按钮提示文字
L3|jzkwww.shubulo.com        HFONT m_font; //按钮文字字体
[;JlU)BQ6\;S]www.shubulo.com        HCURSOR m_OldCursor;
bv*OdOX
I$d书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网
        RECT m_ParentRt;
1V7c
kY3?书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网
        RECT m_BeginRt;电子书下载,计算机电脑教程图书(G"m%MW        x]!G-^
        RECT m_CurrentRt;书部落-计算机PDF电子书之家h:I)V-ipz:C kR
        POINT m_BeginPt;
(@,o&Td:riN0}下载        POINT m_CurrentPt;0Q$F.TY,o(u7N/LK
        int m_CaptionHeight;书部落-计算机PDF电子书之家%r+wdO2L,\|f.Y
        int m_BorderWidth;

wq?+`"['rQ&CSE @书部落-计算机PDF电子书之家
        int m_EdgeWidth;1^ @3g"|'J*|K
TU0hN E

       

W'u(bfd;kSn
@书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网
protected:电子书下载,计算机电脑教程图书}(t}.Y2pNb5]
        //按钮的外边框
G!L1@l U书部落-计算机PDF电子书之家        HPEN m_BoundryPen;电子书下载,计算机电脑教程图书vK]!W7or@
       
%W3_Y0sK#`9pI'`hwww.shubulo.com        //鼠标指针置于按钮之上时按钮的内边框
| tWq$n        HPEN m_InsideBoundryPenLeft;
!LU1w hh,|6xu        HPEN m_InsideBoundryPenRight;
bWS~W K        d f
i电子书下载,计算机电脑教程图书
        HPEN m_InsideBoundryPenTop; ]6Z!~,b{ Y%O
        HPEN m_InsideBoundryPenBottom;
vj4H}(Q*j&kHJ下载       
M)i!V*G!f\!q0B电子书下载,计算机电脑教程图书        //按钮获得焦点时按钮的内边框
bZ,@2]n电子书下载,计算机电脑教程图书        HPEN m_InsideBoundryPenLeftSel;
E        `5j3mSS8X1P^书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网        HPEN m_InsideBoundryPenRightSel;
_eM        V4]m        HPEN m_InsideBoundryPenTopSel;
a%X3zW,x6Z书部落-计算机PDF电子书之家        HPEN m_InsideBoundryPenBottomSel;电子书下载,计算机电脑教程图书%j7WR!z}S&n\Tu
       
;zl/s7m,p4nwww.shubulo.com        //按钮的底色,包括有效和无效两种状态
$l)W,N:yq2|.k)E@+]书部落-计算机PDF电子书之家        HBRUSH m_FillActive;书部落-计算机PDF电子书之家7E0OB"m_;s        v"S?3k
        HBRUSH m_FillInactive;书部落-计算机PDF电子书之家0ZT&o:S4\M$}9E
};
:d3IEP"P/ts电子书下载,计算机电脑教程图书www.shubulo.com.M.k#k8cx%s`2?        \8C,B/Tku
消息回调类里的实现代码:$DO
N-u!nQ$Z


E)K.jNs
iQ书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网
CWINButton::GetItemhWnd()里面www.shubulo.com7`#^?,uT(UaLC

}.[l`WF`

if(SetProp(m_hWnd, "CWINBUTTON", (HANDLE)this) == 0)
3^,Ak D;\.P+k下载{
5e;n0^0H`]l电子书下载,计算机电脑教程图书        OutputDebugString("SetProp ERROR");电子书下载,计算机电脑教程图书:|QxoRm
d

        return FALSE;www.shubulo.comrw!O,t'Mz`L
}书部落-计算机PDF电子书之家
b8QGDJ x_

www.shubulo.com](MZ.{,c"N|
m_OldProc = SetWindowLong(m_hWnd,GWL_WNDPROC,(LONG)stdProc);
(a%Qi+`0~
U D
@书部落-计算机PDF电子书之家
下载d1YU*{%DLp
j,a}

CWINButton::stdProc()里面www.shubulo.com^x:LxG
{书部落-计算机PDF电子书之家+B&X q'c;w9]8L?!pX
        CWINButton* w = (CWINButton*)GetProp(hWnd, "CWINBUTTON");
kt&a.sK}www.shubulo.com        return w->WINProc(uMsg,wParam,lParam);
"\k7O:vH|Y uin}
-U+]i_J `k+]书部落-分享计算机经典巨著,PDF电子书收藏之家,分享互联网下载'O&l9]z.t ayY
Thunk 代码可看我的代码或者去网上查询。

LS5G+iV$O
电子书下载,计算机电脑教程图书5Mc6Y ~Fk3c
以上是我提供给大家的一点浅见,欢迎大家跟我讨论有关的技术。
顶部
 



Powered by Discuz! 5.0.0 © 2001-2006 著作权保护声明|网站法律顾问:ItLaw-庄毅雄律师|
Processed in 0.118927 second(s), 7 queries , Gzip enabled 1024*768
当前时区 GMT+8, 现在时间是 2008-11-20 20:29 清除 Cookies - 联系我们 - 书部落-计算机编程图书资料分享 - Archiver