• <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>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡(jiǎn)單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            DirectUI(一)

            Posted on 2009-10-11 00:36 S.l.e!ep.¢% 閱讀(1716) 評(píng)論(0)  編輯 收藏 引用 所屬分類: DirectUI
            LRESULT?CALLBACK?CWindowWnd::__ControlProc(HWND?hWnd,?UINT?uMsg,?WPARAM?wParam,?LPARAM?lParam)
            {
            ???CWindowWnd
            * ?pThis? = ?NULL;

            ???
            if (?uMsg? == ?WM_NCCREATE?)?
            ???{
            ??????LPCREATESTRUCT?lpcs?
            = ?reinterpret_cast < LPCREATESTRUCT > (lParam);
            ??????pThis?
            = ?static_cast < CWindowWnd *> (lpcs -> lpCreateParams);
            ??????pThis
            -> m_hWnd? = ?hWnd;
            ??????::SetProp(hWnd,?
            " WndX " ,?(HANDLE)?pThis);
            ???}?
            ???
            else ?
            ???{
            ??????pThis?
            = ?reinterpret_cast < CWindowWnd *> (::GetProp(hWnd,? " WndX " ));
            ??????
            if (?uMsg? == ?WM_NCDESTROY? && ?pThis? != ?NULL?)?
            ??????{
            ?????????LRESULT?lRes?
            = ?::CallWindowProc(pThis -> m_OldWndProc,?hWnd,?uMsg,?wParam,?lParam);
            ?????????::SetProp(hWnd,?
            " WndX " ,?NULL);
            ?????????
            if (?pThis -> m_bSubclassed?)?pThis -> Unsubclass();
            ?????????pThis
            -> m_hWnd? = ?NULL;
            ?????????pThis
            -> OnFinalMessage(hWnd);
            ?????????
            return ?lRes;
            ??????}
            ???}

            ???
            if (?pThis? != ?NULL?)?
            ???{
            ??????
            return ?pThis -> HandleMessage(uMsg,?wParam,?lParam);
            ???}?
            ???
            else ?
            ???{
            ??????
            return ?::DefWindowProc(hWnd,?uMsg,?wParam,?lParam);
            ???}
            }

            LRESULT?CALLBACK?CWindowWnd::__WndProc(HWND?hWnd,?UINT?uMsg,?WPARAM?wParam,?LPARAM?lParam)
            {
            ???CWindowWnd
            * ?pThis? = ?NULL;
            ???
            if (?uMsg? == ?WM_NCCREATE?)?
            ???{
            ??????LPCREATESTRUCT?lpcs?
            = ?reinterpret_cast < LPCREATESTRUCT > (lParam);
            ??????pThis?
            = ?static_cast < CWindowWnd *> (lpcs -> lpCreateParams);
            ??????pThis
            -> m_hWnd? = ?hWnd;
            ??????::SetWindowLongPtr(hWnd,?GWLP_USERDATA,?reinterpret_cast
            < LPARAM > (pThis));
            ???}?
            ???
            else ?
            ???{
            ??????pThis?
            = ?reinterpret_cast < CWindowWnd *> (::GetWindowLongPtr(hWnd,?GWLP_USERDATA));
            ??????
            if (?uMsg? == ?WM_NCDESTROY? && ?pThis? != ?NULL?)?
            ??????{
            ?????????LRESULT?lRes?
            = ?::CallWindowProc(pThis -> m_OldWndProc,?hWnd,?uMsg,?wParam,?lParam);
            ?????????::SetWindowLongPtr(pThis
            -> m_hWnd,?GWLP_USERDATA,? 0L );
            ?????????
            if (?pThis -> m_bSubclassed?)?pThis -> Unsubclass();
            ?????????pThis
            -> m_hWnd? = ?NULL;
            ?????????pThis
            -> OnFinalMessage(hWnd);
            ?????????
            return ?lRes;
            ??????}
            ???}

            ???
            if (?pThis? != ?NULL?)?
            ???{
            ??????
            return ?pThis -> HandleMessage(uMsg,?wParam,?lParam);
            ???}?
            ???
            else
            ???{
            ??????
            return ?::DefWindowProc(hWnd,?uMsg,?wParam,?lParam);
            ???}
            }


            當(dāng) CreateWindow 采用已存在的類時(shí),使用的是 __ControlProc, 位于 RegisterSuperclass()
            wc.lpfnWndProc = CWindowWnd::__ControlProc;

            當(dāng) CreateWindow 采用創(chuàng)建的類時(shí),使用的是????? __WndProc, 位于 RegisterWindowClass()
            wc.lpfnWndProc = CWindowWnd::__WndProc;

            這兩個(gè)函數(shù)唯一不同的是,
            __ControlProc 使用 SetProp() 的方式來(lái)設(shè)置 This 指針, 而
            __WndProc???? 使用? SetWindowLogPtr -> GWLP_USERDATA 的方式來(lái)設(shè)置 This 指針

            ·使用已存在的類時(shí),或許是怕別人已經(jīng)設(shè)置過(guò) GWLP_USERDATA ,所以這里采用了 SetProp() 的方式

            void ?CWindowWnd::CenterWindow()
            {
            ???ASSERT(::IsWindow(m_hWnd));
            ???ASSERT((GetWindowStyle(m_hWnd)
            & WS_CHILD) == 0 );

            ???RECT?rcDlg?
            = ?{? 0 ?};
            ???::GetWindowRect(m_hWnd,?
            & rcDlg);
            ???RECT?rcArea?
            = ?{? 0 ?};
            ???RECT?rcCenter?
            = ?{? 0 ?};
            ???HWND?hWndParent?
            = ?::GetParent(m_hWnd);
            ???HWND?hWndCenter?
            = ?::GetWindowOwner(m_hWnd);
            ???::SystemParametersInfo(SPI_GETWORKAREA,?NULL,?
            & rcArea,?NULL);
            ???
            if (?hWndCenter? == ?NULL?)?rcCenter? = ?rcArea;? else ?::GetWindowRect(hWndCenter,? & rcCenter);

            ???
            int ?DlgWidth? = ?rcDlg.right? - ?rcDlg.left;
            ???
            int ?DlgHeight? = ?rcDlg.bottom? - ?rcDlg.top;

            ???
            // ?Find?dialog's?upper?left?based?on?rcCenter
            ??? int ?xLeft? = ?(rcCenter.left? + ?rcCenter.right)? / ? 2 ? - ?DlgWidth? / ? 2 ;
            ???
            int ?yTop? = ?(rcCenter.top? + ?rcCenter.bottom)? / ? 2 ? - ?DlgHeight? / ? 2 ;

            ???
            // ?The?dialog?is?outside?the?screen,?move?it?inside
            ??? if (?xLeft? < ?rcArea.left?)?
            ???????xLeft?
            = ?rcArea.left;
            ???
            else ? if (?xLeft? + ?DlgWidth? > ?rcArea.right?)?
            ???????xLeft?
            = ?rcArea.right? - ?DlgWidth;
            ???
            ???
            if (?yTop? < ?rcArea.top?)?
            ???????yTop?
            = ?rcArea.top;
            ???
            else ? if (?yTop? + ?DlgHeight? > ?rcArea.bottom?)?
            ???????yTop?
            = ?rcArea.bottom? - ?DlgHeight;

            ???::SetWindowPos(m_hWnd,?NULL,?xLeft,?yTop,?
            - 1 ,? - 1 ,?SWP_NOSIZE? | ?SWP_NOZORDER? | ?SWP_NOACTIVATE);
            }

            ·一直以為有 CenterWindow() 這個(gè)API……,看來(lái)是因?yàn)镸FC用久的緣故罷

            HWND?CWindowWnd::Create(HWND?hwndParent,?LPCTSTR?pstrName,?DWORD?dwStyle,?DWORD?dwExStyle,?int?x,?int?y,?int?cx,?int?cy,?HMENU?hMenu)
            {
            ???
            if(?GetSuperClassName()?!=?NULL?&&?!RegisterSuperclass()?)?
            ???????
            return?NULL;
            ???
            ???
            if(?GetSuperClassName()?==?NULL?&&?!RegisterWindowClass()?)?
            ???????
            return?NULL;
            ???
            ???m_hWnd?
            =?::CreateWindowEx(dwExStyle,?GetWindowClassName(),?pstrName,?dwStyle,?x,?y,?cx,?cy,?hwndParent,?hMenu,?CPaintManagerUI::GetResourceInstance(),?this);
            ???ASSERT(m_hWnd
            !=NULL);

            ???
            return?m_hWnd;
            }

            這里在 lpParam 參數(shù)將 this 指針傳過(guò)去,在 WM_NCCREATE? 消息中再獲取 this 指令,但MSDN 相關(guān)解釋卻是在 WM_CREATE? 消息處理……

            lpParam
            [in]? Pointer to a value to be passed to the window through the CREATESTRUCT structure (lpCreateParams member) pointed to by the lParam param of the WM_CREATE message. This message is sent to the created window by this function before it returns.

            If an application calls CreateWindow to create a MDI client window, lpParam should point to a CLIENTCREATESTRUCT structure. If an MDI client window calls CreateWindow to create an MDI child window, lpParam should point to a MDICREATESTRUCT structure. lpParam may be NULL if no additional data is needed.

            ?

            void?CWindowWnd::ResizeClient(int?cx?/*=?-1*/,?int?cy?/*=?-1*/)
            {
            ???ASSERT(::IsWindow(m_hWnd));
            ???RECT?rc?
            =?{?0?};;
            ???
            if(?!::GetClientRect(m_hWnd,?&rc)?)
            ???????
            return;
            ???
            ???
            if(?cx?!=?-1?)?rc.right?=?cx;
            ???
            if(?cy?!=?-1?)?rc.bottom?=?cy;
            ???
            ???
            if(?!::AdjustWindowRectEx(&rc,?GetWindowStyle(m_hWnd),?(!(GetWindowStyle(m_hWnd)?&?WS_CHILD)?&&?(::GetMenu(m_hWnd)?!=?NULL)),?GetWindowExStyle(m_hWnd))?)?
            ???????
            return;
            ???
            ???UINT?uFlags?
            =?SWP_NOZORDER?|?SWP_NOMOVE;
            ???::SetWindowPos(m_hWnd,?NULL,?
            0,?0,?rc.right?-?rc.left,?rc.bottom?-?rc.top,?uFlags);
            }

            AdjustWindowRectEx()

            函數(shù)功能:該函數(shù)依據(jù)所需客戶矩形大小,計(jì)算需要的窗口矩形的大小。計(jì)算出的窗口矩形隨后可以傳送給CreateWindowEx函數(shù),用于創(chuàng)建一個(gè)客戶區(qū)所需大小的窗口。
            函數(shù)原型:BOOL AdjustWindowRectEX(LPRECT lpRect,DWORD dwStyte;BOOL bMenu;DWORD dwExStyle);
            參數(shù):
            lpRect:指向RECT結(jié)構(gòu)的指針,該結(jié)構(gòu)包含所需客戶區(qū)域的左上角和右下角的坐標(biāo)。函數(shù)返回時(shí),該結(jié)構(gòu)包含容納所需客戶區(qū)域的窗口的左上角和右下角的坐標(biāo)。
            dwStyle:指定將被計(jì)算尺寸的窗口的窗口風(fēng)格。
            bMenu:指示窗口是否有菜單。
            dwExStyle:指定將被計(jì)算尺寸的窗口的擴(kuò)展窗口風(fēng)格。
            返回值:如果函數(shù)成功,返回值為非零;如果函數(shù)失敗,返回值為零。若想獲得更多錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。
            備注:客戶矩形是指完全包含一個(gè)客戶區(qū)域的最小矩形;窗口矩形是指完全包含一個(gè)窗口的最小矩形,該窗口包含客戶區(qū)與非客戶區(qū)。
            當(dāng)一個(gè)菜單條下拉出兩行或更多行時(shí),AdjustWindowRect函數(shù)不增加額外的空間。
            速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;頭文件:winuser.h;庫(kù)文件:user32.lib。

            久久精品国产亚洲Aⅴ蜜臀色欲 | 久久精品国产男包| 漂亮人妻被中出中文字幕久久| 人妻系列无码专区久久五月天| 亚洲精品NV久久久久久久久久| 久久人与动人物a级毛片| 日韩精品久久久肉伦网站 | 久久久www免费人成精品| 久久精品国产亚洲av影院| 久久精品人人做人人爽电影| 日本加勒比久久精品| 热re99久久6国产精品免费| 国产精品久久久久久久午夜片| 久久久久亚洲av综合波多野结衣| 2021久久精品国产99国产精品| 日产精品久久久久久久| 狠狠久久综合伊人不卡| 久久精品蜜芽亚洲国产AV| 久久精品一区二区三区AV| 久久久久国色AV免费观看| 久久久精品午夜免费不卡| 人妻无码αv中文字幕久久琪琪布| 狠狠色综合久久久久尤物| 久久精品www人人爽人人| 久久久久久国产精品美女 | 亚洲精品乱码久久久久久| 国内精品久久久久久中文字幕| 精品久久久久久久久午夜福利| 久久久久久精品免费免费自慰| 免费一级欧美大片久久网| 国产一区二区精品久久凹凸| 久久久青草青青亚洲国产免观| 国产精品久久久久久久久鸭| 久久久一本精品99久久精品88| 亚洲伊人久久大香线蕉综合图片| 久久青青草视频| 久久久久久久97| 久久综合狠狠综合久久综合88| 久久久精品人妻一区二区三区蜜桃 | 蜜桃麻豆www久久国产精品| 久久亚洲高清综合|