從csdn上整理的帖子2_關於控件自適用對話框大小

總結1:由於目前開發的程序只是在實驗室內部使用,其使用的顯示器都是實驗室自己訂購的同一個型號(分辨率爲1024*768),因此可以考慮開發程序時將開發環境的分辨率設置與使用環境一樣(即1024*768),這樣就不存在由於開發環境與使用環境的不一樣而導致的對話框自適應分辨率問題了。

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

http://topic.csdn.net/u/20110811/15/66A1AE57-6EA9-4A58-8BFD-6D74E3781BA9.html

A:我寫了一個基於對話框的應用程序,但是當我把分辨率調到800*600後,發現對話框界面沒有完整地顯示出來。請教各位如何解決這個問題呢?有些軟件不管你的分辨率怎麼變化,對話框最大化後都能剛好不多不少地鋪滿整個屏幕。

wltg2001:開始的時候取得屏幕的大小,讓對話框的大小和屏幕相關。

Delphigis:都是硬寫的,沒有捷徑

不過有些是可以取巧的

比如最小設定是800*600(現在比這個還小的不好找了)

比如當界面分辨率大於1024*768時,你採用統一格式

這樣其實你只要排2個版面就可以了

如果適應任意分辨率,則考慮界面的某個部分是指定寬度或高度,其它部分再自動適應

g6785654:你可以用全屏顯示,也可以下面這樣

int x = GetSystemMetrics(SM_CXSCREEN);   //獲取屏幕X像素
    int y = GetSystemMetrics(SM_CYSCREEN);   //獲取屏幕Y像素
//然後在通過MoveWindow來固定位置和大小
MoveWindow(x/2-269,y/2-260,530,560,NULL);   //裏面的參數是MoveWindow(x,y,width,height,NULL);


你可以根據你獲得不同桌面的x,y來確定自己的軟件大小,下面是全屏的方法

/*************************設置父窗口全屏************************************/
    ModifyStyle(WS_CAPTION,0,0);
    int x = GetSystemMetrics(SM_CXSCREEN);   //獲取屏幕X像素
    int y = GetSystemMetrics(SM_CYSCREEN);   //獲取屏幕Y像素

    RECT rectDesktop;
    WINDOWPLACEMENT wpNew;
    WINDOWPLACEMENT m_wpPrev;

    GetWindowPlacement(&m_wpPrev);

    ::GetWindowRect(::GetDesktopWindow(),&rectDesktop);
    ::AdjustWindowRectEx(&rectDesktop, GetStyle(), FALSE, GetExStyle());

    wpNew = m_wpPrev;
    wpNew.showCmd = SW_SHOWNORMAL;
    wpNew.rcNormalPosition = rectDesktop;



    SetWindowPlacement ( &wpNew );
/////////////////////////////////////////////////////////////////////////////


這個寫在OnInitDialog方法中就可以

dsc:來個更狠的,進程啓動時強制將分辨率修改爲指定大小(譬如800*600),進程退出時再恢復爲原來大小。(crybird:用戶體驗會極爲不爽,除了那些傻瓜用戶)

maquan:先說個題外話,多數對話框都不支持調整尺寸,除非對話框內有動態佈局管理的支持。樓主的對話框支持“最大化”,想必是有動態佈局的吧?

說正題,樓主描述的情況,看上去有點歧義,先澄清一下,你的問題到底是下面兩種情形的哪種:

1. 屏幕尺寸先是 1024x768,然後對話框最大化,然後調整屏幕尺寸爲 800x600,發現對話框有一部分顯示到屏幕外邊了;

2. 對話框處於還原狀態,調整屏幕尺寸爲 800x600,然後對話框最大化,發現沒有恰好佔滿整個屏幕;

兩種情形的問題指向是不同的。

tianzhigang889:(作者本人)關於對話框適應不同分辨率問題基本已經解決了。主要分如下幾步:
1.利用GetSystemMetrics(SM_CXSCREEN)函數獲得當前屏幕的寬度和高度cx,xy。
2.分別判斷分辨率大於或等於1024*768和分辨率只等於800*600的兩種情況下就分別做如下處理。
3.利用MoveWindow()函數框定住對話框的大小。對話框的大小自己定,只要大小不超出cx和cy。比如可以這樣做cx-300,cy-200,這樣,在任何分辨率下,你的對話框的大小都比屏幕小,而不會跑到屏幕外邊去。
4.利用ShowWindow(SW_SHOWMAXIMIZED)函數設置全屏
4.在OnSize()裏用MoveWindow()進行各種控件的定位。注意。所有控件的定位都不能超出GetSystemMetrics(SM_CXSCREEN)函數獲得的cx和cy這兩個參數的值。


 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

http://topic.csdn.net/t/20010921/16/297000.html

A:我在800*600下,用做了一個程序,當顯示器分辨率爲1024*768時,所有控件大小長寬都不變,而且都縮到左上角了。在初始對話框設置時,能不能使它按不同分辨率調整大小和佈局?

Julienjut在主框架的WM_SIZE消息中,根據分辨率來改變所有控件和本身的大小和相對位置。

dux不會自動調整,因爲資源文件裏的對資源的描述就是固定的大小,比如40,40,30,30   描述一個button,它在不同的分辨率下顯示都是這個數,當然結果就是底分辨率下顯示較大,高分辨率下顯示較小,並且相對位置不動,要自動調整,就用Julienjut(秋水)的方法,攔截WM_SIZE消息。

 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

http://topic.csdn.net/u/20090330/18/1E7AA53F-65F0-4213-BC6E-C85C6EB48221.html

A:我的SDI程序左側有個工具欄(類似於樹狀結構),右邊的view中嵌入的是個dialog,當我點擊按鈕使左側的工具欄隱藏後如何使右側的對話框自動調整大小,填滿整個view畫面?最好是對話框上的控件的位置也相應地做調整。

cnzdgsGetClientRect獲取視圖窗口客戶區大小,然後用MoveWindow調整對話框,再根據對話框大小用MoveWindow逐一調整控件。

oyljerry MoveWindow 調整對話框大小,同時響應對話框WM_SIZE消息,等比例的MoveWindow 調整對話框上的控件大小

allenhiman:

響應yourview::onsize( uint type, int cx, int cy )
{
  if( yourdlg.GetSafeHwnd() )
{
  yourdlg.MoveWindow( 0, 0, cx, cy );
  yourdlg.button.SetWindowPos(...,SWP_NOSIZE );
}
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

http://topic.csdn.net/u/20090402/20/B0A685D9-5C48-47A9-8926-D060F5DBD564.html

A:我做了一個基於對話框的應用程序(上面用的控件比較多),開發的時候我的機器分辨率是1152*864,可是安裝到到一臺分辨率爲1024*768的機器上時,有一部分界面跑到屏幕外面去了(我做的是全屏顯示的)。 針對這個問題搜索了不少帖子,可是沒有找到一個滿意的答案,大家有沒有遇到這個問題,都是怎麼解決的呢?希望大家不吝賜教,呵呵。對了,界面上的控件還有TAB控件。
  我總結的解決方法:
  1、用MoveWindow()或者SetWindowPos()函數挨個控件的調整,我嘗試了一下,好像不太可行,特別是有tab控件的時候。
  2、用一些現成的控件,找到了幾個,但是隻能用於visual basic. VC++裏面用不了。
  3、有一些類,可以把自己的對話框所對應的類從其繼承,好像就能自動適應分別率的變化了,不過,沒有找到。
  呵呵,就這些了,大家有好的解決方法,或者什麼有效的工具,多多賜教吧,呵呵!!

wqvbjhc:可以使用下面的代碼獲得當前分辨率(桌面大小): 
  m_Width=GetSystemMetrics(SM_CXSCREEN); 
  m_Height=GetSystemMetrics(SM_CYSCREEN); 
現在的程序就會有這種情況,如果在更高分辨率的機子上運行窗口只不過是變小了而已,但如果在低分辨率的機子上運行就有可能出現窗口布局錯亂的情況. 你可以把自己的機子的分辨率調爲1027*768,然後在這基礎上開發.這樣開發出來的程序只要不在800*600或更低的分辨率下的機子(現在應該很少使用這種分辨率了吧)運行窗口的佈局一般是不會有問題的.

yjkwf:樓上說的有道理,但要是拿到分辨率高點的機器上去,顯得就有點小了,原來全屏顯示的,現在可能跑到一角去了,右下角就空出一塊空白來了!

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

http://topic.csdn.net/u/20100508/21/FBC00E77-837A-47DC-91BD-1A5824A6E975.html#r_65280045

A:急請高手指點!VC中怎樣使窗口最大化時,窗口中控件的佈局也跟着發生變化??

設計窗口時,控件佈局很合理,可是當窗口最大化後,所有的控件都到了屏幕的左上角。我知道在WM_SIZE消息函數中可以調整控件。

void CMyBMPDlg::OnSize(UINT nType, int cx, int cy) 
{
CResizableDialog::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
CWnd *pWnd;
pWnd = GetDlgItem(IDC_ON); //獲取控件句柄IDOK爲你要調整的控件ID
if(nType==1) return; //如果最小化則什麼都不做
if(pWnd)//判斷是否爲空,因爲對話框創建時會調用此函數,而當時控件還未創建
{
CRect rect; //獲取控件變化前大小
pWnd->GetWindowRect(&rect);
ScreenToClient(&rect);//將控件大小轉換爲在對話框中的區域座標
rect.left=rect.left*cx/m_rect.Width();//調整控件大小
rect.right=rect.right*cx/m_rect.Width();//定義m_rect用來存儲控件變化前的大小
rect.top=rect.top*cy/m_rect.Height();
rect.bottom=rect.bottom*cy/m_rect.Height();
pWnd->MoveWindow(rect);//設置控件大小
}


但是這種方法只能單個控件調整,而且控件上的文字也並沒有隨之發生改變。有什麼方法可以使所有窗口中控件的佈局隨窗口大小而改變???而且控件中的文字也一起隨之改變??求大蝦們指點!

xianglitian:http://blog.csdn.net/xianglitian/archive/2007/08/02/1722448.aspx

VisualEleven:http://www.codeproject.com/kb/dialog/easysize.aspx

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

http://blog.csdn.net/xianglitian/article/details/5667015

界面佈局動態調整

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

http://wenku.baidu.com/view/e5d96308763231126edb1112.html

http://yinxusunday963.blog.163.com/blog/static/52764844201022932224633/

VC中自動改變控件位置和大小的對話框類

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

http://www.codeproject.com/dialog/resizabledialog.asp

CResizableDialog
By   Paolo   Messina  
A   CDialog   derived   class   to   implement   resizable   dialogs   with   MFC  

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

http://www.codeproject.com/dialog/easysize.asp

EasySize   -   Dialog   resizing   in   no   time!
By   Marc   Richarme  
An   easy   way   to   position   controls   in   resizable   dialogs   or   property   pages   using   just   a   few   macros    

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章