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

            浪跡天涯

            唯有努力...
            努力....再努力...

            如何更改屬性頁向導頁的字體

            前段時間,一個底層開發的同事寫一個MFC工具,在想實現設置屬性頁字體時遇到了困難,問我該如何實現?根據多年的經驗,想當然的以為很簡單,只需在資源里,更改對話框的字體即可,試了試不行;那就CreateFont,然后SetFont,可是無論怎么弄,程序運行后,屬性頁的字體依然如故!在網上搜索也沒有找到好的解決辦法,最后折騰許久,終于找到一篇文章,最終把這個問題解決了。
              
            文章:http://support.microsoft.com/default.aspx?scid=kb;en-us;142170
            示例下載:http://download.microsoft.com/download/vc60pro/samp40/1/win98/en-us/prpfont.exe

            概要

            PRPFONT 說明如何為您 CPropertyPages 在資源編輯器, 并在運行時設置所需字體, 設置要和一切正常大小相同表的字體。 所有這是一個類稱為 CMySheet 中完成。 調用 ChangeDialogFont() 函數進行調整窗口以及設置字體工作。 CPropertySheet::BuildPropPageArray() 被覆蓋以便不重置網頁中字體。

            更多信息

            在 VisualC++ 的版本低于 4.0, MFC 必須自己實現 CPropertySheet。 對于您 CPropertySheet 通過資源編輯器中設置首 CPropertyPage 您對話框資源的字體可能設置字體。 在運行時, 表將使用字體設置并一切根據字體大小。 開頭 VisualC++4.0, MFC 使用 Windows 95 PropertySheet 控件。 此控件將始終使用系統字體來表。 這是設計使然。 MFC 還將強制頁以用作表相同字體。 這樣調用 BuildPropPageArray() 函數中。 因為這是無出處函數, 它可能更改或將來的 MFC 版本中被刪除。

            CMySheet 將使用的首活動 CPropertyPage 字體來設置字體和 CPropertySheet 和其子窗口大小。 CPropertyPages 與資源編輯器中指定字體顯示。

            具體步驟:
            1、新建類CMySheet,繼承自CPropertySheet
            2、在.cpp文件中大概實現如下。
            3、修改.h文件。
            4、使用這個CMySheet,更改資源中的屬性頁,則程序運行后,設置的字體有效。

            #define WM_RESIZEPAGE WM_APP+1

            enum { CDF_CENTER, CDF_TOPLEFT, CDF_NONE };

            // helper function which sets the font for a window and all its children
            // and also resizes everything according to the new font
            void ChangeDialogFont(CWnd* pWnd, CFont* pFont, int nFlag)
            {
             CRect windowRect;

             // grab old and new text metrics
             TEXTMETRIC tmOld, tmNew;
             CDC * pDC = pWnd->GetDC();
             CFont * pSavedFont = pDC->SelectObject(pWnd->GetFont());
             pDC->GetTextMetrics(&tmOld);
             pDC->SelectObject(pFont);
             pDC->GetTextMetrics(&tmNew);
             pDC->SelectObject(pSavedFont);
             pWnd->ReleaseDC(pDC);

             long oldHeight = tmOld.tmHeight+tmOld.tmExternalLeading;
             long newHeight = tmNew.tmHeight+tmNew.tmExternalLeading;

             if (nFlag != CDF_NONE)
             {
              // calculate new dialog window rectangle
              CRect clientRect, newClientRect, newWindowRect;

              pWnd->GetWindowRect(windowRect);
              pWnd->GetClientRect(clientRect);
              long xDiff = windowRect.Width() - clientRect.Width();
              long yDiff = windowRect.Height() - clientRect.Height();
             
              newClientRect.left = newClientRect.top = 0;
              newClientRect.right = clientRect.right * tmNew.tmAveCharWidth / tmOld.tmAveCharWidth;
              newClientRect.bottom = clientRect.bottom * newHeight / oldHeight;

              if (nFlag == CDF_TOPLEFT) // resize with origin at top/left of window
              {
               newWindowRect.left = windowRect.left;
               newWindowRect.top = windowRect.top;
               newWindowRect.right = windowRect.left + newClientRect.right + xDiff;
               newWindowRect.bottom = windowRect.top + newClientRect.bottom + yDiff;
              }
              else if (nFlag == CDF_CENTER) // resize with origin at center of window
              {
               newWindowRect.left = windowRect.left -
                   (newClientRect.right - clientRect.right)/2;
               newWindowRect.top = windowRect.top -
                   (newClientRect.bottom - clientRect.bottom)/2;
               newWindowRect.right = newWindowRect.left + newClientRect.right + xDiff;
               newWindowRect.bottom = newWindowRect.top + newClientRect.bottom + yDiff;
              }
              pWnd->MoveWindow(newWindowRect);
             }

             pWnd->SetFont(pFont);

             // iterate through and move all child windows and change their font.
             CWnd* pChildWnd = pWnd->GetWindow(GW_CHILD);

             while (pChildWnd)
             {
              pChildWnd->SetFont(pFont);
              pChildWnd->GetWindowRect(windowRect);

              CString strClass;
              ::GetClassName(pChildWnd->m_hWnd, strClass.GetBufferSetLength(32), 31);
              strClass.MakeUpper();
              if(strClass==_T("COMBOBOX"))
              {
               CRect rect;
               pChildWnd->SendMessage(CB_GETDROPPEDCONTROLRECT,0,(LPARAM) &rect);
               windowRect.right = rect.right;
               windowRect.bottom = rect.bottom;
              }

              pWnd->ScreenToClient(windowRect);
              windowRect.left = windowRect.left * tmNew.tmAveCharWidth / tmOld.tmAveCharWidth;
              windowRect.right = windowRect.right * tmNew.tmAveCharWidth / tmOld.tmAveCharWidth;
              windowRect.top = windowRect.top * newHeight / oldHeight;
              windowRect.bottom = windowRect.bottom * newHeight / oldHeight;
              pChildWnd->MoveWindow(windowRect);
              
              pChildWnd = pChildWnd->GetWindow(GW_HWNDNEXT);
             }
            }
            /////////////////////////////////////////////////////////////////////////////
            // CMySheet

            IMPLEMENT_DYNAMIC(CMySheet, CPropertySheet)

            CMySheet::CMySheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
             :CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
            {
            }

            CMySheet::CMySheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
             :CPropertySheet(pszCaption, pParentWnd, iSelectPage)
            {
            }

            CMySheet::~CMySheet()
            {
             if (m_fntPage.m_hObject)
              VERIFY (m_fntPage.DeleteObject ());
            }

            BEGIN_MESSAGE_MAP(CMySheet, CPropertySheet)
             //{{AFX_MSG_MAP(CMySheet)
             //}}AFX_MSG_MAP
             ON_MESSAGE (WM_RESIZEPAGE, OnResizePage) 
            END_MESSAGE_MAP()

            /////////////////////////////////////////////////////////////////////////////
            // CMySheet message handlers

            void CMySheet::BuildPropPageArray()
            {
             CPropertySheet::BuildPropPageArray();

             // get first page
             CPropertyPage* pPage = GetPage (0);
             ASSERT (pPage);
             
             // dialog template class in afxpriv.h
             CDialogTemplate dlgtemp;
             // load the dialog template
             VERIFY (dlgtemp.Load (pPage->m_psp.pszTemplate));
             // get the font information
             CString strFace;
             WORD wSize;
             VERIFY (dlgtemp.GetFont (strFace, wSize));
             if (m_fntPage.m_hObject)
              VERIFY (m_fntPage.DeleteObject ());
             // create a font using the info from first page
             VERIFY (m_fntPage.CreatePointFont (wSize*10, strFace));
            }

            BOOL CMySheet::OnInitDialog()
            {
             CPropertySheet::OnInitDialog();

             // get the font for the first active page
             CPropertyPage* pPage = GetActivePage ();
             ASSERT (pPage);

             // change the font for the sheet
             ChangeDialogFont (this, &m_fntPage, CDF_CENTER);
             // change the font for each page
             for (int iCntr = 0; iCntr < GetPageCount (); iCntr++)
             {
              VERIFY (SetActivePage (iCntr));
              CPropertyPage* pPage = GetActivePage ();
              ASSERT (pPage);
              ChangeDialogFont (pPage, &m_fntPage, CDF_CENTER);
             }

             VERIFY (SetActivePage (pPage));

             // set and save the size of the page
             CTabCtrl* pTab = GetTabControl ();
             ASSERT (pTab);

             if (m_psh.dwFlags & PSH_WIZARD)
             {
              pTab->ShowWindow (SW_HIDE);
              GetClientRect (&m_rctPage);

              CWnd* pButton = GetDlgItem (ID_WIZBACK);
              ASSERT (pButton);
              CRect rc;
              pButton->GetWindowRect (&rc);
              ScreenToClient (&rc);
              m_rctPage.bottom = rc.top-2;
             }
             else
             {
              pTab->GetWindowRect (&m_rctPage);
              ScreenToClient (&m_rctPage);
              pTab->AdjustRect (FALSE, &m_rctPage);
             }

             // resize the page 
             pPage->MoveWindow (&m_rctPage);

             return TRUE;
            }

            BOOL CMySheet::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
            {
             NMHDR* pnmh = (LPNMHDR) lParam;

             // the sheet resizes the page whenever it is activated so we need to size it correctly
             if (TCN_SELCHANGE == pnmh->code)
              PostMessage (WM_RESIZEPAGE);
             
             return CPropertySheet::OnNotify(wParam, lParam, pResult);
            }

            LONG CMySheet::OnResizePage (UINT, LONG)
            {
             // resize the page
             CPropertyPage* pPage = GetActivePage ();
             ASSERT (pPage);
             pPage->MoveWindow (&m_rctPage);

             return 0;
            }

            BOOL CMySheet::OnCommand(WPARAM wParam, LPARAM lParam)
            {
             // the sheet resizes the page whenever the Apply button is clicked so we need to size it correctly
             if (ID_APPLY_NOW == wParam ||
              ID_WIZNEXT == wParam ||
              ID_WIZBACK == wParam)
              PostMessage (WM_RESIZEPAGE);
             
             return CPropertySheet::OnCommand(wParam, lParam);
            }

            posted on 2008-01-25 17:42 浪跡天涯 閱讀(5649) 評論(10)  編輯 收藏 引用 所屬分類: C++

            評論

            # re: 如何更改屬性頁向導頁的字體 2008-01-30 09:21 追夢時代

            學習了,謝謝樓主  回復  更多評論   

            # re: 如何更改屬性頁向導頁的字體 2008-07-25 00:02 cuckoo321

            寫的很不錯。請問大俠,如何更改屬性頁的標題字體和字號?  回復  更多評論   

            # re: 如何更改屬性頁向導頁的字體 2008-07-28 08:56 浪擊天涯

            你可以試試這樣行嗎?

            怎樣改變標題欄的寬度:

            方法一:

            NONCLIENTMETRICS ncm;
            ncm.cbSize = sizeof( NONCLIENTMETRICS );

            ::SystemParametersInfo( SPI_GETNONCLIENTMETRICS,
            sizeof( NONCLIENTMETRICS ),
            &ncm,
            0
            );

            ncm.lfCaptionFont.lfHeight = -300;
            ::SystemParametersInfo( SPI_SETNONCLIENTMETRICS,
            sizeof( NONCLIENTMETRICS ),
            &ncm,
            SPIF_SENDCHANGE
            );
             

            方法二:

            case WM_NCCALCSIZE:
            {
            BOOL bSpecial=FALSE;
            int nEdgeWidth =3;
            int nBarHeight =CAPTIONHEIGHT+3;
            int nBottomEdge =3;

            if(!(BOOL)wParam)
            {
            RECT rtSave;
            CopyRect(&rtSave,(LPRECT)lParam);
            // ::CallWindowProcA(lpwndinfo->pWndProc,hWnd,uMsg,wParam,lParam);


            if(lpwndinfo->bIM ==TRUE)
            {
            int imbarheight =17;
            rtSave.left+=nEdgeWidth;
            rtSave.top+=imbarheight+3;
            rtSave.right-=nEdgeWidth;
            rtSave.bottom-=nBottomEdge;
            }
            else
            {
            rtSave.left+=nEdgeWidth;
            rtSave.top+=nBarHeight;
            rtSave.right-=nEdgeWidth;
            rtSave.bottom-=nBottomEdge;
            }
            CopyRect((LPRECT)lParam,&rtSave);

            *lResult=0;
            ::ReleaseDC(hWnd,hDC);
            return TRUE;
            }
            else
            {
            RECT rtSave;
            LPRECT prtClt;
            LPNCCALCSIZE_PARAMS pNC;
            pNC=(LPNCCALCSIZE_PARAMS)lParam;

            prtClt=&(pNC->rgrc[0]);
            CopyRect(&rtSave,prtClt);
            CopyRect( &(pNC->rgrc[2]), &(pNC->rgrc[1]));

            if(bSysDlg)
            {
            (pNC->rgrc[2]).left +=nEdgeWidth;
            (pNC->rgrc[2]).right -=nEdgeWidth;
            }
            else
            {
            if(lpwndinfo->bIM ==TRUE)
            {
            int imbarheight =17;
            (pNC->rgrc[2]).left +=nEdgeWidth;
            (pNC->rgrc[2]).top +=imbarheight+3;
            (pNC->rgrc[2]).right -=nEdgeWidth;
            (pNC->rgrc[2]).bottom -=nBottomEdge;

            rtSave.left+=nEdgeWidth;
            rtSave.top+=imbarheight+3;
            rtSave.right-=nEdgeWidth;
            rtSave.bottom-=nBottomEdge;
            }
            else
            {
            (pNC->rgrc[2]).left+=nEdgeWidth;
            (pNC->rgrc[2]).top+=nBarHeight;
            (pNC->rgrc[2]).right-=nEdgeWidth;
            (pNC->rgrc[2]).bottom-=nBottomEdge;
            // Result=::CallWindowProcA(lpwndinfo->pWndProc,hWnd,uMsg,wParam,lParam);
            //prtClt=&(pNC->rgrc[0]);
            rtSave.left+=nEdgeWidth;
            rtSave.top+=nBarHeight;
            rtSave.right-=nEdgeWidth;
            rtSave.bottom-=nBottomEdge;
            }
            }
            CopyRect(prtClt,&rtSave);
            *lResult=0;
            ::ReleaseDC(hWnd,hDC);
            return TRUE;
            }
            break;
            }   回復  更多評論   

            # re: 如何更改屬性頁向導頁的字體 2008-08-19 16:41 勤奮的人

            你好 用了你的方法可以實現更改字體了;
            但是出現了新的問題
            就是編輯框沒辦法輸入中文了;都是亂碼
            請問這個能解決嗎?  回復  更多評論   

            # re: 如何更改屬性頁向導頁的字體 2008-08-19 16:50 浪跡天涯

            我試了,我這是可以輸入中文,而且顯示也不是亂碼的。  回復  更多評論   

            # re: 如何更改屬性頁向導頁的字體 2008-08-19 18:19 勤奮的人

            終于找到什么原因了 我做的是PROE二次開發 不知道為什么 創建的非模式對話框里 用編輯框或者組合框鍵盤輸入 中文 總是顯示亂碼 創建的模式對話框就不會!還在摸索中! 不過仍然很感謝你! 我才知道不是程序問題!  回復  更多評論   

            # re: 如何更改屬性頁向導頁的字體 2008-08-19 18:26 浪跡天涯

            呵,客氣!
            輸入中文亂碼的問題,有可能是和字符集設置有關,具體原因我也沒碰見過。  回復  更多評論   

            # re: 如何更改屬性頁向導頁的字體 2008-09-13 11:24 RSW

            按照上面的方法,無法修改某些窗口的大?。ū热纾谋究颍?,有時還感覺它變小了,而且對于靜態文本框文字輸入很多的話,有部分不能顯示。
            不知道有沒有解決辦法  回復  更多評論   

            # re: 如何更改屬性頁向導頁的字體 2008-09-13 12:01 RSW

            我把窗口調小一點,窗口就可以完整顯示了。^_^
            調大了好像部分被什么東西遮擋了。
              回復  更多評論   

            # re: 如何更改屬性頁向導頁的字體 2008-09-16 09:18 浪跡天涯

            這可能是你屬性頁顯示范圍太小,調大顯示范圍即可!  回復  更多評論   

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            導航

            統計

            常用鏈接

            留言簿(22)

            隨筆分類(30)

            隨筆檔案(29)

            文章分類

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久热这里只有精品在线观看| 国产91久久综合| 久久精品成人影院| 久久www免费人成看国产片| 久久精品成人| 亚洲乱码中文字幕久久孕妇黑人 | 色综合合久久天天给综看| 蜜臀久久99精品久久久久久| 精品综合久久久久久97| 亚洲国产精品一区二区久久| 久久天天躁狠狠躁夜夜躁2014| 久久精品亚洲中文字幕无码麻豆| 亚洲精品高清国产一久久| 久久AV无码精品人妻糸列| 亚洲国产成人久久精品影视| 亚洲精品无码久久久久sm| 久久天天躁狠狠躁夜夜不卡| 国产精品99久久精品| 超级97碰碰碰碰久久久久最新 | 久久精品九九亚洲精品| 久久久久无码精品| 99久久精品国内| 伊人久久大香线蕉亚洲| 色偷偷91久久综合噜噜噜噜| 国产高潮久久免费观看| 日本免费久久久久久久网站| 久久人人爽人人爽人人片av高请| 性高湖久久久久久久久AAAAA| 欧美综合天天夜夜久久| jizzjizz国产精品久久| 久久精品国产亚洲AV高清热| 久久久www免费人成精品| 香蕉aa三级久久毛片| 女同久久| 中文字幕无码久久人妻| 亚洲精品tv久久久久| 亚洲国产精品一区二区三区久久| 久久综合日本熟妇| 久久久久久国产精品美女| 久久亚洲精品无码aⅴ大香| 老男人久久青草av高清|