在MFC的MDI程式中設定子視窗客戶區大小

2021-07-30 03:20:53 字數 1351 閱讀 6485

用mfc寫乙個基於opencv的mdi程式,每一次讀取影象之後,影象都會顯示在主程式的乙個子視窗中。

問題來了:根據讀取的影象大小採用movewindow函式來設定子視窗大小時,顯示的視窗尺寸實際上是包含了「標題欄+邊框+客戶區」整個區域,

導致每次顯示讀取的影象時,總會有右邊和下邊的一小部分沒顯示出來。

查了很多資料之後都沒有解決,後來就想了乙個比較笨的方法。

基本思路:先按照影象尺寸把視窗(假設為視窗1)設定好,然後再讀取這個視窗1的客戶區。因為需要設定子視窗的客戶區大小應該是讀取影象的尺寸,所以就可以得到視窗1客戶區與所需要設定視窗客戶區大小的差值。根據這個差值,重新調整視窗1的大小就可以了。

此時,還會出現乙個問題:這個修正後的視窗大小還包含了下邊和右邊的邊框寬度,還是會有一小部分畫素值沒顯示出來。

所以,在修正視窗1大小的時候,還應該把邊框寬度值給補上去,這裡用了getsystemmetrics()函式。補上這個差值之後,子視窗客戶區就正好可以容納讀取的影象了。

// 獲取影象

cv::mat img = pdoc->tmpim;

// 設定子視窗大小,正好可以容納影象

crect rect_t;

rect.top = 0;

rect.left = 0;

rect.right = img.cols;

rect.bottom = img.rows;

getparentframe()->movewindow(rect); //設定視窗大小,但是該視窗包含了選單和邊框寬度

getparentframe()->getclientrect(rect_t); //獲取此時的客戶區大小

// 根據實際客戶區大小,將子視窗的客戶區大小調整為影象尺寸

rect.right += img.cols - rect_t.right + getsystemmetrics(33); //邊框寬度#define sm_cyframe 33

rect.bottom += img.rows - rect_t.bottom + getsystemmetrics(32); //邊框寬度#define sm_cxframe 32

getparentframe()->movewindow(rect); //調整以後,重新設定視窗大小

反正程式先這麼寫著,如果以後還能找到更簡單的方法再來補上。

MFC中建立沒有子視窗的MDI應用程式

如何建立乙個 沒有子視窗的多文件應用程式 這裡涉及到 ccommandlineinfo 類 下面說說這個類的用處 這個類在 mfc應用程式初始化時候呼叫 可以通過命令引數 來設定 程式初始狀態 cmdinfo.m nshellcommand ccommandlineinfo filenothing ...

MFC實現啟動時無子視窗的MDI程式

parsecommandline cmdinfo 後面加上cmdinfo.m nshellcommand ccommandlineinfo filenothing 具體 如下 分析標準 shell 命令 dde 開啟檔案操作的命令列 ccommandlineinfo cmdinfo parsecom...

在MFC程式中顯示WPF視窗

最近想要在原有系統 基於mfc,非託管 中加入wpf的介面。搜尋了一段時間,發現大部分文章都是在談託管程式c 中呼叫wpf,還是不太適合我的需要。於是自己嘗試著從本機c 的mfc程式中呼叫wpf,使用c 實現乙個com元件作為中間層。目標是在mfc程式中彈出乙個wpf視窗。新增乙個window,命名...