お世話になって すこしづつ 使い勝手の良い一筆描画アプリケーションが出来ます
今回は 変数(色も)を入力(あるいは描画Windowで直接変更があると表示)するDiglogWindowの最少化位置の変更です。
現状はDeskTopの左下に収まります。ドラッグドロップで位置変更可能です。
これを描画Window(唯一のアプリのWindowですが その中の左下に位置するようしたいので助言をおねがいします。
本当は関連コードを提示しないといけないのですが
現在 ほとんど理解していない状態で かってそのDialogを画面にどこに提示するかも すこし 移動させた記憶があるのですが そのコードを探せないでいます。
アプリの名前はKolamDesignerで そのKolamDesigner.rcには
IDD_ParameterDIALOG DIALOGEX 0, 0, 225, 144
があります これなど Dialogのサイズでしょうか?
はんにゃ
レス付きませんねぇ。
おそらく、質問の意味がさっぱりわからないからでしょう。
んで、エスパーになったつもりで考えて見ると。
1.DLG(ダイアログ)を最小化した場合の表示位置は変更できません。
ポップアップチャイルドもできません。唯一、MDIチャイルド
ウインドウの場合のみMDIの親のクライアント領域に最小化
されます。当該のDLGにご希望の動作をさせることは出来ませんが、
MDIチャイルドのクライアント領域にそのDLGを貼り付け(子として
作成する)れば、ご希望の動作に近いかもしれません。
注意しなければならないのは、この場合MDIチャイルドウインドウ
は、その親のクライアント領域を出ることができない、という点で、
これは、ポップアップチャイルドやモードレスDLGと大きく動作が
異なる点です。
ということかもしれません。
ありがとうございます
>DLG(ダイアログ)を最小化した場合の表示位置は変更できません。
最小化した表示位置を自動的に指定できないということでしょうか?
現状では 一度最小化され、Desktopの左下のWindowはマウスで位置を任意にどこでも アプリの描画Window内(に重ねて)でも移動できます。
ただ 描画Windowのいちを変えても そのDesktop上でそのままです。
まず このダイアログサはモードレスを優先したいので 現状を選択します
それと やはり この親子関係など小生にはむずかしく うっかりいじると
すべてパーになりそうです。
(そんな奴は質問するな!と叱られそうです)
諦めさせて頂き ありがとうございました
> 現状では 一度最小化され、Desktopの左下のWindowはマウスで位置を任意にどこでも アプリの描画Window内(に重ねて)でも移動できます。
その「モードレスダイアログ」は「アプリの描画Window」ではなく「デスクトップ」を親として作成していると推測できる。
だとすれば、普通はこういう動作になる。
それでも何とかしたいのなら WM_WINDOWPOSCHANGED を捕まえてやれば(超無理やりにだが)それっぽくできる。
void 「アプリの描画Window」::OnWindowPosChanged(WINDOWPOS *lpwndpos) {
CDialog::OnWindowPosChanged(lpwndpos);
if ((lpwndpos->flags & (SWP_NOMOVE | SWP_NOSIZE)) != (SWP_NOMOVE | SWP_NOSIZE)) {
if (「モードレスダイアログ」.GetSafeHwnd() != NULL) {
CRect rect, modeless;
GetClientRect(rect);
ClientToScreen(rect);
「モードレスダイアログ」.GetWindowRect(modeless);
WINDOWPLACEMENT wp = { 0 };
wp.length = sizeof(WINDOWPLACEMENT);
「モードレスダイアログ」.GetWindowPlacement(&wp);
wp.flags = WPF_SETMINPOSITION;
// 「モードレスダイアログ」の最小化時の位置を「アプリの描画Window」領域の左下に
wp.ptMinPosition.x = rect.left;
wp.ptMinPosition.y = rect.bottom - modeless.Height();
「モードレスダイアログ」.SetWindowPlacement(&wp);
}
}
}
「モードレスダイアログ」に topmost スタイルを設定しないと「アプリの描画Window」の裏に隠れてしまうけどね…
ありがとうございます
これは魅力ですが 「モードレスダイアログ」に topmost スタイルを設定することを勉強してから これを試します
(小生の理解は)「モードレスダイアログ」の親は「アプリの描画Window」ではなく「デスクトップ」であることなど 今これを読んで なるほどそういう関係かと知るような状態です
すみません
実は起動すると直ぐにで表示されるDialogをスクリーンのどの位置に表示するか
雛形から 動かした記憶があるのですが
どのコードでそうしたか 探せないでいます。
こんなコードのはずという助言を頂ければ幸いです
起動の他にMenuBarのDialogoをクリックすると一度消したDialogは表示されます
MoveWindowとか?
ありがとうございました
ChildView.cppの中にありました
こういうところで 最小化の位置指定が出来ると良いなと思ったのですが
これまでの助言からは無理のようです。
void CChildView::OnParameterSet()
{
// 2009/10/27 t.yoshino モードレス表示
// m_wndParam.SetWindowPos(&wndTopMost,0,0,0,0,SWP_NOSIZE); // 必要なし
// m_wndParam.CenterWindow(); // 親ウィンドウに対して中央寄せ 無いと右寄せ
// m_wndParam.RightWindow(); // 親ウィンドウに対して右寄せ、//'RightWindow' : 'CParameterDlg' のメンバではありません。
//2009/10/29 以下追加 右寄せ by totoko
// http://social.msdn.microsoft.com/Forums/ja-JP/user/threads?user=Shonan%20Hannya
// 親ウィンドウの位置を得る
CRect rectParent;
GetWindowRect(&rectParent);
// 子ウィンドウの位置を得る
CRect rectChild;
m_wndParam.GetWindowRect(&rectChild);
// 親の右端から子の幅分オフセットさせた位置に配置
long width = rectChild.right - rectChild.left;
rectChild.right = rectParent.right;
rectChild.left = rectChild.right - width;
// 親ウィンドウの中ほどの高さに配置 by ミッヒー
long parentHeight = rectParent.bottom - rectParent.top;
long childHeight = rectChild.bottom - rectChild.top;
rectChild.top = rectParent.top + parentHeight / 4;
rectChild.bottom = rectChild.top + childHeight;
// ここまで
m_wndParam.MoveWindow(&rectChild);
m_wndParam.BringWindowToTop(); // 前に持ってくる
m_wndParam.ShowWindow(SW_SHOW); // 表示
} //endof OnParameterSet(
>実は起動すると直ぐにで表示されるDialogをスクリーンのどの位置に表示するか
当該DLGのWM_INITDIALOG 又は OnInitDialog()のハンドラで
自分自身の位置を指定します。
みいさんのアドバイスを参照してください。
そのほかにはStrWindowPos()が使えます。
ツイート | ![]() |