• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-60  評(píng)論-262  文章-1  trackbacks-0

            要實(shí)現(xiàn)一個(gè)將 IP 地址控件的 disabled 狀態(tài), 但是 Windows 的實(shí)現(xiàn)就沒有將控件的顏色灰掉,
            M$ 真是的, 最后一步懶得弄了, 我只好自己弄咯. 下面是我的WTL,實(shí)現(xiàn)代碼.  BTW, 這個(gè)控件在
            動(dòng)態(tài)改變大小時(shí), 里面的四個(gè) EDIT 的大小沒跟著改變, 我也懶得弄了 ;-)
             
             
            #ifndef __ATL_GRAY_IP_ADDR_CTRL_H__
            #define __ATL_GRAY_IP_ADDR_CTRL_H__
            #pragma once
            #include <vector>
             
            #ifndef ARRAYSIZE
            #define ARRAYSIZE( x ) (sizeof(x)/sizeof((x)[0]))
            #endif // !defined(ARRAYSIZE)

            namespace WTL {
                class CGrayIPAddrCtrlImpl : public CWindowImpl<CGrayIPAddrCtrlImpl, CIPAddressCtrl>
                {
                    typedef CWindowImpl<CGrayIPAddrCtrlImpl, CIPAddressCtrl> baseClass;
                public:
                    BEGIN_MSG_MAP_EX(CGrayIPAddrCtrlImpl)
                        MESSAGE_HANDLER(WM_CREATE, OnCreate)
                        MESSAGE_HANDLER(WM_PAINT, OnPaint)
                        MESSAGE_HANDLER(WM_SIZE, OnSize)
                    END_MSG_MAP();
                    CGrayIPAddrCtrlImpl() : m_uFourTimes(0)
                    { }
                    LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
                    {
                        uMsg, wParam, lParam, bHandled;
                        m_vecEdit.clear();
                        ::EnumChildWindows(m_hWnd, EnumChildProc, (LPARAM)this);
                        bHandled = FALSE;
                        return S_OK;
                    }
                    static BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam)
                    {
                        CGrayIPAddrCtrlImpl *pThis = reinterpret_cast<CGrayIPAddrCtrlImpl *>(lParam);
                        CEdit wndEdit(hwnd);
                        if (pThis->m_uFourTimes < 4)
                        {
                            wndEdit.SetReadOnly();
                            pThis->m_uFourTimes ++;
                        }
                        RECT rc = { 0 };
                        wndEdit.GetClientRect(&rc);
                        wndEdit.ClientToScreen(&rc);
                        pThis->m_vecEdit.push_back(rc);
                        ATLTRACE("======================EnumChildProc==%d==%d==%d===================\n",
                            pThis->m_vecEdit.size(), rc.left, rc.right);
                        return TRUE;
                    }
                    BOOL SubclassWindow(HWND hWnd)
                    {
                        BOOL bReturn = baseClass::SubclassWindow(hWnd);
                        if (bReturn) {
                            m_vecEdit.clear();
                            ::EnumChildWindows(m_hWnd, EnumChildProc, (LPARAM)this);
                        }
                        return bReturn;
                    }
                    LRESULT OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
                    {
                        uMsg, wParam, lParam, bHandled;
                        TCHAR szText[MAX_PATH];
                        GetWindowText(szText, ARRAYSIZE(szText));
                        CRect       rc;
                        CPaintDC    dcMem(m_hWnd); 
                        GetClientRect(rc); 
                        COLORREF crBack = GetSysColor(COLOR_BTNFACE);
                        ::SetBkColor(dcMem, crBack);
                        ::ExtTextOut(dcMem, 0, 0, ETO_OPAQUE, &rc, NULL, 0, NULL);
                        {
                            DWORD   dwFlags = DT_CENTER;
                            DWORD   dwStyle = GetExStyle();
                            COLORREF    crOldBk     = 0xFFFFFFFF;
                            UINT        nOldMode    = (UINT)-1;
                            if (dwStyle & WS_EX_TRANSPARENT) {
                                nOldMode = dcMem.SetBkMode(TRANSPARENT);
                            } else {
                                crOldBk = dcMem.SetBkColor(crBack);
                            }
                            TCHAR szDot[] = _T(".");
                            RECT rcTemp;
                            std::vector<RECT>::reverse_iterator it;
                            for(it=m_vecEdit.rbegin(); it!=m_vecEdit.rend(); it++)
                            {
                                std::vector<RECT>::reverse_iterator itNext = it+1;
                                if (itNext != m_vecEdit.rend())
                                {
                                    rcTemp.top = it->top;
                                    rcTemp.bottom = it->bottom;
                                    rcTemp.left = it->right;
                                    rcTemp.right = itNext->left;
                                    ScreenToClient(&rcTemp);
                                    dcMem.DrawText(szDot, _tcslen(szDot), &rcTemp, dwFlags);  
                                }
                            }
                            if (dwStyle & WS_EX_TRANSPARENT) {
                                dcMem.SetBkMode(nOldMode);
                            } else {
                                dcMem.SetBkColor(crOldBk);
                            }
                        }
                        return S_OK;
                    }
                    LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
                    {
                        uMsg, wParam, lParam, bHandled;
                        m_vecEdit.clear();
                        ::EnumChildWindows(m_hWnd, EnumChildProc, (LPARAM)this);
                        bHandled = FALSE;
                        return S_OK;
                    }
                    UINT m_uFourTimes;
                    std::vector< RECT > m_vecEdit;
                };

            };  // namespace WTL

            #endif  // __ATL_GRAY_IP_ADDR_CTRL_H__

            posted on 2008-03-08 14:51 free2000fly 閱讀(456) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            国产精品熟女福利久久AV| 香港aa三级久久三级| 色偷偷88欧美精品久久久| 久久精品国产福利国产琪琪| 欧美色综合久久久久久| 亚洲AV日韩AV天堂久久| 国产福利电影一区二区三区久久老子无码午夜伦不| 久久精品国产亚洲AV电影| 国内精品免费久久影院| 亚洲欧洲日产国码无码久久99| 亚洲午夜久久影院| 18禁黄久久久AAA片| 成人a毛片久久免费播放| 一本久久知道综合久久| 欧美一级久久久久久久大| 精品水蜜桃久久久久久久| 亚洲国产成人久久综合碰碰动漫3d| 日日狠狠久久偷偷色综合免费| 久久香综合精品久久伊人| 伊人情人综合成人久久网小说| 欧美久久综合性欧美| 亚洲综合伊人久久综合| 国产99久久久国产精品小说| 久久er国产精品免费观看8| 久久91精品久久91综合| 久久夜色精品国产噜噜麻豆| 久久精品中文字幕大胸| 久久综合日本熟妇| 久久久久国产日韩精品网站| 亚洲嫩草影院久久精品| 久久精品国产只有精品2020| 成人资源影音先锋久久资源网| 久久婷婷成人综合色综合| 少妇高潮惨叫久久久久久| 色诱久久久久综合网ywww| 久久综合亚洲欧美成人| 久久综合国产乱子伦精品免费| 亚洲中文精品久久久久久不卡| 欧美黑人激情性久久| 久久久久亚洲AV成人片| 国内精品久久久人妻中文字幕 |