现在的位置: 首页 > 综合 > 正文

非模态颜色对话框的研究和实现。

2013年08月19日 ⁄ 综合 ⁄ 共 2477字 ⁄ 字号 评论关闭
 实现代码请到下面的地址下载。
http://download.csdn.net/source/179043

最近作图像处理时,想写一些演示颜色运算的例子程序,需要一个非模态的颜色选取对话框,并能够实时得到对话框上选取的当前颜色值。在网上查了些相关资料,没有找到更好的解决办法。但找到一篇 扩展颜色对话框  的例子。
从此处出发,了解ChooseColor函数。就产生了下面的想法。
建立一个新的线程,在线程中调用ChooseColor函数,会不会实现非模态的效果呢。果然,经过下面代码的测试

    DWORD WINAPI DlgFunc(LPVOID pParam)
    {
        COLORREF retColor = RGB( 255,0,0);

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

        CHOOSECOLOR cc = {
            sizeof( CHOOSECOLOR ),
                NULL, // 父窗口啦,设置为NULL的话,就是桌面了
                NULL,  // 一个句柄,没用到,详看MSDN
                retColor,  // 如果设置了CC_RGBINIT 就是初始的颜色值了,同时它作为返回值,返回所选择的颜色
                cusColor, // 初始的自定义颜色数组,设置为NULL的话,会出错,不设置的话,好像就是随机值了,我把它都清理成0了
                CC_RGBINIT|CC_FULLOPEN | CC_ENABLEHOOK | CC_ANYCOLOR, // 红色为设置自己的消息处理函数
                NULL,
                (LPCCHOOKPROC)MyCCHookProc, // 使用自定义的消息处理函数
                NULL
        };
        ChooseColor( &cc );

        return 0;
    }

    CreateThread(NULL,NULL,&DlgFunc,NULL,0,&dwThreadId);

非模态的对话框显示出来了
==怎么显示出来的对话框,可以跑到主窗口的后面呢??着可不是我想要的结果
CHOOSECOLOR结构的成员hwndOwner设为主窗口句柄,呵呵,线程白白建立了,还是模态的。
那么好吧,我在建立一个以主窗口为父窗口的非模态对话框X,再将这个非模态对话框X的句柄传给CHOOSECOLOR结构。OK,非模态的颜色对话框产生了。将非模态对话框X隐藏,就天衣无缝了。
实现代码如下
    CAboutDlg            m_dlgabt;

    DWORD WINAPI DlgFunc(LPVOID pParam)
    {
        COLORREF retColor = RGB( 255,0,0);

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

        CHOOSECOLOR cc = {
            sizeof( CHOOSECOLOR ),
                m_dlgabt.m_hWnd, // 父窗口啦,设置为NULL的话,就是桌面了
                NULL,  // 一个句柄,没用到,详看MSDN
                retColor,  // 如果设置了CC_RGBINIT 就是初始的颜色值了,同时它作为返回值,返回所选择的颜色
                cusColor, // 初始的自定义颜色数组,设置为NULL的话,会出错,不设置的话,好像就是随机值了,我把它都清理成0了
                CC_RGBINIT|CC_FULLOPEN | CC_ENABLEHOOK | CC_ANYCOLOR, // 红色为设置自己的消息处理函数
                NULL,
                (LPCCHOOKPROC)MyCCHookProc, // 使用自定义的消息处理函数
                NULL
        };
        ChooseColor( &cc );

        return 0;
    }

    m_dlgabt.Create(IDD_ABOUTBOX);

    CreateThread(NULL,NULL,&DlgFunc,NULL,0,&dwThreadId);

那么怎么能实时的得到颜色对话框的选取颜色呢?spy一下,得到对话框上的3个颜色值edit的ID.定时轮循查看这3个控件值的改变,就得到想要的颜色了。
                char strValue[20];

                int r = 0;
                ::GetWindowText(GetDlgItem(hwnd,0x02c2),strValue,20);
                if ( strValue[0] )
                    r = atoi(strValue);

                int g = 0;
                ::GetWindowText(GetDlgItem(hwnd,0x02c3),strValue,20);
                if ( strValue[0] )
                    g = atoi(strValue);

                int b = 0;
                ::GetWindowText(GetDlgItem(hwnd,0x02c4),strValue,20);
                if ( strValue[0] )
                    b = atoi(strValue);

                COLORREF cl = RGB(r,g,b);

好了,经过反复尝试,终于得到了想要的效果,呵呵,希望大家多多交流,找到更好的解决办法啊!

抱歉!评论已关闭.