• <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级毛片久久久精品毛片| 国内精品久久久久影院日本| 无码日韩人妻精品久久蜜桃| 思思久久99热免费精品6| 久久国产精品偷99| 亚洲综合伊人久久综合| 久久91亚洲人成电影网站| 久久精品国产免费一区| 无码国内精品久久人妻蜜桃| 99久久99这里只有免费费精品| 热久久这里只有精品| 欧美精品福利视频一区二区三区久久久精品 | 99精品国产免费久久久久久下载 | 99久久99久久精品国产片果冻| 69国产成人综合久久精品| 色天使久久综合网天天| 久久精品人人做人人爽电影蜜月| 久久国产精品免费| 精品久久久久久| 丁香色欲久久久久久综合网| 亚洲国产精品久久久久婷婷软件| 国内精品伊人久久久影院| 久久电影网2021| 久久香蕉国产线看观看精品yw| 天天影视色香欲综合久久| 2021久久精品国产99国产精品| 一本大道久久香蕉成人网| 久久国产三级无码一区二区| 午夜久久久久久禁播电影| 久久有码中文字幕| 久久久网中文字幕| 久久婷婷五月综合色99啪ak| 久久中文娱乐网| 久久最新精品国产| 99久久亚洲综合精品成人| 99久久99这里只有免费的精品| 久久精品亚洲精品国产色婷| 18岁日韩内射颜射午夜久久成人| 久久午夜夜伦鲁鲁片免费无码影视| 日韩十八禁一区二区久久| 亚洲欧洲精品成人久久曰影片 |