• <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 浪跡天涯 閱讀(5650) 評論(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 浪跡天涯

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

            <2008年1月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            導航

            統計

            常用鏈接

            留言簿(22)

            隨筆分類(30)

            隨筆檔案(29)

            文章分類

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品久久久久观看99水蜜桃 | 日产精品久久久久久久| 久久精品亚洲欧美日韩久久| 国产毛片久久久久久国产毛片 | 久久久久精品国产亚洲AV无码| 色8激情欧美成人久久综合电| 久久九色综合九色99伊人| 久久久久人妻精品一区三寸蜜桃| 亚洲婷婷国产精品电影人久久| 久久影院综合精品| 少妇久久久久久被弄到高潮| 久久久久久亚洲Av无码精品专口| 久久精品免费大片国产大片| 无码伊人66久久大杳蕉网站谷歌| 日韩精品久久久久久| 久久久亚洲AV波多野结衣| 亚洲欧美日韩精品久久| 久久久久99精品成人片欧美| 久久久无码精品午夜| 久久福利青草精品资源站| 中文字幕久久久久人妻| 久久综合久久鬼色| 亚洲嫩草影院久久精品| 97久久精品人妻人人搡人人玩| 久久综合九色欧美综合狠狠| 中文精品久久久久国产网址| 午夜天堂精品久久久久| 亚洲午夜无码久久久久| 久久只这里是精品66| 久久成人永久免费播放| 国产成人久久777777| 国产精品久久网| 色综合久久最新中文字幕| 国产亚洲精品自在久久| 91精品国产色综合久久| 97久久精品午夜一区二区| 久久国产热精品波多野结衣AV| 日产精品久久久久久久性色| 亚洲综合熟女久久久30p| 99精品国产99久久久久久97| 久久久久久国产精品无码下载|