分享
 
 
 

扩展颜色对话框 - (关键字:CHOOSECOLOR,CColorDialog,通用对话框)

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

原创,转载请注明出处。

--------------------------------------------------

样品:

材料:

(1) 参数

typedef struct {

DWORD lStructSize;

HWND hwndOwner;

HWND hInstance;

COLORREF rgbResult;

COLORREF * lpCustColors;

DWORD Flags;

LPARAM lCustData;

LPCCHOOKPROC lpfnHook;

LPCTSTR lpTemplateName;

} CHOOSECOLOR, *LPCHOOSECOLOR;

(2) API函数

BOOL ChooseColor(

LPCHOOSECOLOR lpcc // initialization data

);

(3) 回调函数,用于处理消息

UINT_PTR CALLBACK CCHookProc(

HWND hdlg, // handle to dialog box

UINT uiMsg, // message identifier

WPARAM wParam, // message parameter

LPARAM lParam // message parameter

);

方法:

(1)、填写结构体:

COLORREF retColor = RGB( 255,0,0);

COLORREF cusColor[16];

memset( cusColor, 0, sizeof( COLORREF) * 16 );

CHOOSECOLOR cc = {

sizeof( CHOOSECOLOR ),

m_hwndParent, // 父窗口啦,设置为NULL的话,就是桌面了

NULL, // 一个句柄,没用到,详看MSDN

retColor, // 如果设置了CC_RGBINIT 就是初始的颜色值了,同时它作为返回值,返回所选择的颜色

cusColor, // 初始的自定义颜色数组,设置为NULL的话,会出错,不设置的话,好像就是随机值了,我把它都清理成0了

CC_RGBINIT|CC_FULLOPEN | CC_ENABLEHOOK | CC_ANYCOLOR, // 红色为设置自己的消息处理函数

NULL,

(LPCCHOOKPROC)MyCCHookProc, // 使用自定义的消息处理函数

NULL

};

(2)、调用

ChooseColor( &cc ); // 点击"确定"返回 TRUE, 否则返回 FALSE

(3)、自定义的消息处理函数

HWND hAlpha;// 用于显示alpha值的文本框

int xCurrentScroll;// 用于保存滚动条的当前值,同时也是alpha值

UINT_PTR CALLBACK CAColorDialog::MyCCHookProc(

HWND hdlg, // handle to dialog box

UINT uiMsg, // message identifier

WPARAM wParam, // message parameter

LPARAM lParam // message parameter

)

{

HWND hctrl;

RECT rt;

POINT pt;

int Delta; // xDelta = new_pos - current_pos

int xNewPos; // new position

BOOL fScroll = FALSE;

switch( uiMsg )

{

case WM_INITDIALOG:

ASSERT( pthis );

// 修改颜色对话框的大小

::GetWindowRect( hdlg, &rt );

rt.bottom += 20;

::SetWindowPos( hdlg, NULL, 0,0, rt.right - rt.left,

rt.bottom - rt.top , SWP_NOMOVE );

// 修改“取消”按钮的位置

hctrl = ::GetDlgItem( hdlg, IDCANCEL );

::GetWindowRect( hctrl, &rt );

pt.x = rt.left;

pt.y = rt.top ;

::ScreenToClient( hdlg, &pt );

pt.x += 250;

pt.y += 22;

::SetWindowPos( hctrl, NULL, pt.x, pt.y , 0, 0, SWP_NOSIZE );

// 修改“确定”按钮的位置

hctrl = ::GetDlgItem( hdlg, IDOK );

::GetWindowRect( hctrl, &rt );

pt.x = rt.left;

pt.y = rt.top ;

::ScreenToClient( hdlg, &pt );

pt.x += 250;

pt.y += 22;

::SetWindowPos( hctrl, NULL, pt.x, pt.y , 0, 0, SWP_NOSIZE );

// 添加滚动条

pt.x -= 250;

hctrl = CreateWindowEx(

0L,

"ScrollBar",

"alpha channel",

SBS_TOPALIGN|SBS_LEFTALIGN|WS_CHILD |WS_VISIBLE | WS_TABSTOP,

pt.x,

pt.y,

160,

20,

hdlg,

NULL,

NULL,

NULL );

::SetScrollRange( hctrl, SB_CTL, 0, 255, TRUE );

::SetScrollPos( hctrl, SB_CTL, 128, FALSE );

xCurrentScroll = 128;

// 添加一个文本框,用于显示当前透明度

pt.x += 162;

hAlpha = CreateWindowEx(

0L,

"Edit",

"alpha value",

//ES_READONLY|

ES_LEFT|ES_NUMBER|WS_CHILD |WS_VISIBLE | WS_TABSTOP,

pt.x,

pt.y,

36,

20,

hdlg,

NULL,

NULL,

NULL );

pt.x -= 162;

// 添加一个静态文本,字体有点问题

pt.y -= 22;

hctrl = CreateWindowEx(

0L,

"STATIC",

"透明度(255表示完全不透明)",

WS_CHILD |WS_VISIBLE ,

pt.x,

pt.y,

220,

20,

hdlg,

NULL,

NULL,

NULL );

::SetWindowText( pthis->hAlpha, "128" );

break;

case WM_HSCROLL:

{

hctrl = (HWND)lParam;

// 滚动条的事件处理,摘自MSDN

switch (LOWORD(wParam))

{

// 键盘上的pageup/down

case SB_PAGEUP:

xNewPos = xCurrentScroll - 20;

break;

case SB_PAGEDOWN:

xNewPos = xCurrentScroll + 20;

break;

// 单击左右箭头,或者用键盘上的方向键

case SB_LINEUP:

xNewPos = xCurrentScroll - 1;

break;

case SB_LINEDOWN:

xNewPos = xCurrentScroll + 1;

break;

// 用鼠标拖动滑杆(结束)

case SB_THUMBPOSITION:

xNewPos = HIWORD(wParam);

break;

// 用鼠标拖动滑杆(过程)

case SB_THUMBTRACK:

xNewPos = HIWORD(wParam);

break;

default:

xNewPos = xCurrentScroll;

}

xNewPos = max(0, xNewPos);

xNewPos = min(255, xNewPos);

if (xNewPos == xCurrentScroll)

break;

fScroll = TRUE;

Delta = xNewPos - xCurrentScroll;

xCurrentScroll = xNewPos;

// Reset the scroll bar.

SetScrollPos( hctrl, SB_CTL, xCurrentScroll, fScroll );

char str[4];

strset(str, 0);

sprintf( str, "%d", xCurrentScroll );

::SetWindowText( hAlpha, str );

break;

}

/*

case WM_COMMAND:

if( LOWORD(wParam) == IDOK ) // 确定按钮

{

// TRACE("IDOK click");

char str[];

::GetWindowText(hAlpha, str, 3 );

atoi( str );

}

*/

}

// 返回 0 ,表示由默认的消息处理函数继续进行处理

// 返回非0的话,会很郁闷

return 0;

}

// -----------------------------------------------------------

这样就好了

使用CColorDialog的话,可以用子类化的方法,CodeProject上有个例子

http://www.codeproject.com/dialog/select_all_button.asp

// -----------------------------------------------------------

另外,曾试着封装成一个类,遇到了一些难题:

1、如何把回调函数作为类的方法?

方法:设置成静态成员,static

2、如何让静态成员访问类里的数据?

方法:在类里添加一个静态类指针,eg:

--- .h file ---

class MyColorDialog:

{

MyColorDialog()

{

pthis = this;

}

static MyColorDialog* pthis;

static UINT CALLBACK MyCCHookProc( ... );

}

--- .cpp file ---

MyColorDialog* MyColorDialog::pthis = NULL; // 重要,不然会出链接错误

...

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有