WEB开发网
开发学院软件开发VC 用 Win API 实现自绘按钮类 阅读

用 Win API 实现自绘按钮类

 2007-03-17 21:59:30 来源:WEB开发网   
核心提示: 下面我说一下我做的这个类的一个问题,我把按钮类做成了一个动态库,用 Win API 实现自绘按钮类(2),调用时只要加上我的头文件和连接的lib库就可以了,我的动态库在WIN32的程序加载是没有问题的,包括有效和无效两种状态HBRUSH m_FillActive;HBRUSH m_Fill

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

自绘按钮类声明:class DLLPORT CWINButton
{
public:
  //初始化按钮(这是第一步!)
  BOOL GetItemhWnd(HWND hWnd);
  //还原按钮区域设置
  BOOL Restore();
  //设置按钮是否可以拖动
  BOOL SetDrag(BOOL Enable);
  //设置按钮图标
  BOOL SetIcon(HICON icon);
  //设置按钮文字
  BOOL SetText(char *text, HFONT font);
  BOOL SetText(char *text);
  BOOL SetText(char *text, COLORREF color);
  //设置按钮有效区域
  BOOL SetupRegion(COLORREF TransColor);
  LRESULT OnPaint(HDC hdc);
  //设置按钮无效时的图片
  BOOL SetDisablePic(HBITMAP bmp);
  //设置按钮按下时的图片
  BOOL SetPressPic(HBITMAP bmp);
  //设置悬停按钮时的图片
  BOOL SetHoverPic(HBITMAP bmp);
  //设置按钮背景图片,第二个参数是是否根据图片调整按钮大小
  BOOL SetBackPic(HBITMAP bmp, BOOL bReSize);
  //设置按钮的提示消息
  BOOL SetToolTip(char *text);
  CWINButton();
  virtual ~CWINButton();
  
private:
  static LRESULT WINAPI stdProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam);
  WNDPROC GetThunk();
  WNDPROC CreateThunk();
  LRESULT CALLBACK WINProc(UINT message, WPARAM wParam, LPARAM lParam);
  BOOL DrawInsideBorder(HDC dc, RECT *rect);
  BOOL DrawFlat(HDC dc, RECT *rect);
  BOOL DrawDefault(HDC dc);
  HWND m_ToolTip;
  HWND m_hWnd;
  HWND m_hWndParent;
  LONG m_OldProc;
  WNDPROC m_thunk;
  TOOLINFO ti;
  HICON m_icon;
  HBITMAP m_Back; //按钮背景图片
  HBITMAP m_Hove; //鼠标悬停时按钮背景图片
  HBITMAP m_Press; //鼠标按下时按钮背景图片
  HBITMAP m_Disable; //按钮无效时背景图片
  BITMAP bm;
  COLORREF m_textcolor; //按钮文字的颜色
  BOOL m_bMouseTracking; //判断鼠标是否在窗口内
  BOOL m_bPress; //判断鼠标是否按下
  BOOL m_Enable; //控件是否有效
  BOOL m_bFocus; //按钮是否处于输入焦点
  BOOL m_bOwnerDraw; //判断是否用户自己贴图
  BOOL m_bDrag; //是否处于拖动状态
  BOOL m_bDragEnable; //是否允许拖动
  char m_text[MAX_TEXTLEN]; //按钮文字
  char m_tiptext[MAX_TEXTLEN]; //按钮提示文字
  HFONT m_font; //按钮文字字体
  HCURSOR m_OldCursor;
  RECT m_ParentRt;
  RECT m_BeginRt;
  RECT m_CurrentRt;
  POINT m_BeginPt;
  POINT m_CurrentPt;
  int m_CaptionHeight;
  int m_BorderWidth;
  int m_EdgeWidth;
  
protected:
  //按钮的外边框
  HPEN m_BoundryPen;
  
  //鼠标指针置于按钮之上时按钮的内边框
  HPEN m_InsideBoundryPenLeft;
  HPEN m_InsideBoundryPenRight;
  HPEN m_InsideBoundryPenTop;
  HPEN m_InsideBoundryPenBottom;
  
  //按钮获得焦点时按钮的内边框
  HPEN m_InsideBoundryPenLeftSel;
  HPEN m_InsideBoundryPenRightSel;
  HPEN m_InsideBoundryPenTopSel;
  HPEN m_InsideBoundryPenBottomSel;
  
  //按钮的底色,包括有效和无效两种状态
  HBRUSH m_FillActive;
  HBRUSH m_FillInactive;
};
消息回调类里的实现代码:CWINButton::GetItemhWnd()里面
if(SetProp(m_hWnd, "CWINBUTTON", (HANDLE)this) == 0)
{
  OutputDebugString("SetProp ERROR");
  return FALSE;
}
m_OldProc = SetWindowLong(m_hWnd,GWL_WNDPROC,(LONG)stdProc);
CWINButton::stdProc()里面
{
  CWINButton* w = (CWINButton*)GetProp(hWnd, "CWINBUTTON");
  return w->WINProc(uMsg,wParam,lParam);
}

Thunk 代码可看我的代码或者去网上查询。

以上是我提供给大家的一点浅见,欢迎大家跟我讨论有关的技术。

上一页  1 2 

Tags:Win API 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接