打造自己的CButton[1]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

里面用到了很多常用的技巧

////////////////////////////////////////////////////////////////////////////////
1、单字节字符转化为双字节字符
...
 WCHAR str[256];
 ZeroMemory( str , 256 );

 CString stra;
 this->GetWindowText( stra );

 int len = sizeof( stra.GetBuffer() );
 MultiByteToWideChar( CP_ACP , 0 , (LPCSTR)stra.GetBuffer() , len , str , len );
...
与 MultiByteToWideChar() 对应的,有一个 WideCharToMultiByte()
后者把双字节字符转为单字节GDI+编程中经常用到
char szANSIString[MAX_PATH];
WideCharToMultiByte(
 CP_ACP , WC_COMPOSITECHECK ,
 wszSomeString , -1 ,
 szANSIString , sizeof( szANSIString ) ,
 NULL , NULL
 );

这里有一个A2W与W2A宏
char temp[] = "how are you";
USES_CONVERSION;
LPWSTR string = A2W( temp );
...
USES_CONVERSION;
szANSIString = W2A( wszSomeString );

参考资料:
 《精通GDI+编程》清华大学出版社

////////////////////////////////////////////////////////////////////////////////
2、当鼠标进入按钮区域后,又移动时,检测指针是否移出了该区域

当鼠村进入按钮区域并移动时,会触发 OnMouseMove() 事件
这时你可以用   
 ::SetCapture( this->GetSafeHwnd() );
把鼠标梆定到该按钮
这样在 OnMouseMove() 事件处理函数中,可以检测出指针是否已经离开区域
...
 CRect rect;
 GetClientRect( rect );
 BOOL ptIn = rect.PtInRect( point );
...
 if( !ptIn )
 {
  //哈哈,鼠标已经移出按钮区域啦
  //你可以用
  ::ReleaseCapture();
  //释放刚才的梆定 
 } 
具体可以看下面的代码,要结合上下文才能理解噢!

////////////////////////////////////////////////////////////////////////////////

文件:
d1_dynamicBtn.h
d1_dynamicBtn.cpp
定义按钮外形、鼠标移动到上面时色彩的变化。

文件:
userBtn1.h
userBtn1.cpp
继承 class d1_dynamicBtn
里面只需实现 构造函数 及 响应必要的按钮行为,如clicked

源文件

////////////////////////////////////////////////////////////////////////////////
// d1_dynamicBtn.h
// 程序员:黄江斌
// 功能:动态按钮类声明
// 时间:20:05 2005-10-1
// 最后修改时间:20:05 2005-10-1
////////////////////////////////////////////////////////////////////////////////

#pragma once


// d1_dynamicBtn

class d1_dynamicBtn : public CButton
{
 DECLARE_DYNAMIC(d1_dynamicBtn)

public:
 //定义是不创建,要在下文中创建按钮
 d1_dynamicBtn();
 //定义对象时创建按钮
 d1_dynamicBtn(
  LPCTSTR lpszCaption , DWORD dwStyle , const RECT &rect ,
  CWnd *pParentWnd , UINT nID
  );
 //定义对象时创建按钮,并且指定配方方案
 d1_dynamicBtn(
  LPCTSTR lpszCaption , DWORD dwStyle , const RECT &rect ,
  CWnd *pParentWnd , UINT nID ,
  Color colorLeveal , Color colorEnter , Color colorDown , Color colorFont );

 virtual ~d1_dynamicBtn();
public:
 void SetColor( Color colorLeavel , Color colorEnter , Color colorDown , Color colorFont );
private:
 //变量初始化,每个构造函数都要调用
 void init();
private:
 Color *m_colorLeavel;
 Color *m_colorEnter;
 Color *m_colorDown;
 Color *m_colorFont;
 //按钮当前状态

 //0鼠标没有进入按钮区,或已经离开
 //1鼠标进入按钮区
 //2鼠标被按下
 int m_nState;
 //为 m_nState 定义的常量
 static const int MOUSE_LEAVEL = 0;
 static const int MOUSE_ENTER = 1;
 static const int MOUSE_DOWN = 2;
protected:
 DECLARE_MESSAGE_MAP()
public:
 afx_msg void OnPaint();
 virtual BOOL Create(LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
 afx_msg void OnMouseMove(UINT nFlags, CPoint point);
 afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
 afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
};

////////////////////////////////////////////////////////////////////////////////
// d1_dynamicBtn.cpp
// 程序员:黄江斌
// 功能:动态按钮类实现
// 时间:20:05 2005-10-1
// 最后修改时间:20:05 2005-10-1
////////////////////////////////////////////////////////////////////////////////

// d1_dynamicBtn.cpp : 实现文件
//

#include "stdafx.h"
#include "d1_dynamicBtn.h"


// d1_dynamicBtn

IMPLEMENT_DYNAMIC(d1_dynamicBtn, CButton)

//构造函数

本文关键:打造自己的CButton
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top