CmyDialog myDlg; //ダイアログのクラスを生成
myDlg.m_str1 = "…"; //呼び出す前にデフォルト値を指定
myDlg.DoModal(); //ダイアログボックスを開く
… = myDlg.m_str1; //戻ってから入力値を参照
void C…View::OnDraw(CDC *pDC) {
…
pDC->TextOut(0, 0, "文字列");
}
void C…Dlg::OnPaint() {
if (IsIconinc()) { //
…
}
else {
CPaintDC dc(this);
dc.TextOut(0, 0, "文字列");
…
}
}
void C…View::OnLButtonDown(UINT nFlags, CPoint point) {
CClientDC cltdc(this);
cltdc.TextOut(0, 0, "文字列");
…
}
CmyDialog myDlg; //ダイアログのクラスを生成
myDlg.DoModal(); //ダイアログボックスを開く
◆★DoModal関数の戻り値
IDOK OKボタンクリック
IDCANCEL キャンセルボタンクリック
-1 ダイアログ作成エラー
IDABORT それ以外のエラー
CString WStr;
WStr.LoadString(IDS_STRING_YAHHO); //リソースの文字列取出し
GetDlgItem(IDC_STATIC1)->SetWindowText(WStr);
◆スタティックテキストも、IDを変更すればClassWizardで文字列を表示できる。
CSecondWindow *pChild;
pChild = new CSecondWindow(this);
●親の終了時、忘れずメモリ解放する。
delete pChild;
pChild->Create(IDD_DIALOG2); //作成するダイアログのIDを指定
pChild->DestroyWindow();
#define WM_USER_FINISH (WM_USER + 0x1000) //BからAへのメッセージ
#define WM_DROW_DATA (WM_USER + 0x1001) //AからBへのメッセージ
// 生成されたメッセージ マップ関数
protected:
//{{AFX_MSG(CXxxYyy)
// メモ - ClassWizard はこの位置にメンバ関数を追加または削除します。
// この位置に生成されるコードを編集しないでください。
//}}AFX_MSG
afx_msg LRESULT OnUserFinish(WPARAM wParam = 0, LPARAM lParam = 0);
DECLARE_MESSAGE_MAP()
};
BEGIN_MESSAGE_MAP(CXxxYyy, CYyy)
//{{AFX_MSG_MAP(CXxxView)
// メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
// この位置に生成されるコードを編集しないでください。
//}}AFX_MSG_MAP
…
ON_MESSAGE(WM_USER_FINISH, OnUserFinish)
//WM_USER_FINISHメッセージを受け取ったらOnUserFinish関数を呼び出す
…
END_MESSAGE_MAP()
LONG CXXXXX::OnUserFinish(UINT wParam, LONG lParam) // ユーザメッセージ受信
{
// メッセージを受信したときの処理を記述する
…
m_pDlg->DestroyWindow();
return(0);
}
void CChildDlg::PostNcDestroy()
{
delete this;
}
◆これだと、親でメモリ開放する必要がないのだ。
COLORREF m_clrText = RGB(0xff,0,0); //初期値
CColorDialog dlgColor(m_clrText, CC_FULLOPEN);//拡張選択部分も開く
if (dlgColor.DoModal() == IDOK) {
m_clrText = dlgColor.GetColor(); //ユーザが選択したRGB値
}
◆●ダイアログボックス生成時の引数
CColorDialog(
COLORREF clrInit = 0, //色選択の初期値
DWORD dwFlags = 0, //フラグ★
CWnd* pParentWnd = NULL //親ウィンドウまたはオーナーウィンドウへのポインタ
);
★dwFlags
CC_FULLOPEN ダイアログボックス右側の拡張選択部分も最初から開く。
BOOL Create( LPCTSTR lpszTemplateName, CWnd* pParentWnd = NULL );
pChild->Create(IDD_DIALOG2, GetDesktopWindow());//親子にしない
pChild->mpParent = this; //必要であれば自分のハンドルを教える↓
CXXXXX::CXXXXX(CWnd* pParent /*=NULL*/)
: CDialog(CXXXXX::IDD, pParent)
{
//{{AFX_DATA_INIT(CDispGraph)
//}}AFX_DATA_INIT
//mpParent = pParent; //メインウィンドウ ←コメントアウト
}
◆ダイアログベースで、モードレスダイアログボックスを表示したとき、これをしないと、モードレスダイアログボックスの方が必ず前面に表示されてしまう。親ウィンドウにフォーカスがあっても。
//CDialog::OnOK();
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
//起動時の画面サイズ設定
cs.cx = 400;
cs.cy = 600;
cs.x = (::GetSystemMetrics(SM_CXSCREEN) - cs.cx) / 2;
cs.y = (::GetSystemMetrics(SM_CYSCREEN) - cs.cy) / 2;
//サイズ゙変更不可・最小化ボタンと最大化ボタンなし ADD 06/01/13
cs.style &= ~(WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX);
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
return TRUE;
}
◆CREATESTRUCT構造体
typedef struct tagCREATESTRUCT {
LPVOID lpCreateParams; //ウィンドウの作成に使われるデータへのポインタ
HANDLE hInstance; //モジュール インスタンス ハンドル
HMENU hMenu; //メニューID
HWND hwndParent; //所有するウィンドウ(トップレベルのときはNULL)
int cy; //ウィンドウの高さ
int cx; //ウィンドウ幅
int y; //ウィンドウの左上隅のy座標
int x; //ウィンドウの左上隅のx座標
LONG style; //ウィンドウスタイル
LPCSTR lpszName; //ウィンドウの名前
LPCSTR lpszClass; //Windows のクラス名
DWORD dwExStyle; //拡張スタイル
} CREATESTRUCT;
//プロパティシート
CPropertySheet SetSheet("オプション設定");
//プロパティページ
CSettingPage1 SetPage1; //プロパティページのクラスはCSettingPage1(基本クラスがCPropertyPage)
CSettingPage2 SetPage2;
…
//プロパティシートにページを追加
SetSheet.AddPage(&SetPage1);
SetSheet.AddPage(&SetPage2);
SetPage1.m_XXXX = ●●; //各ページのダイアログにメンバ変数を追加しておけば初期値を設定できる
…
if(SetSheet.DoModal() == IDOK){ //「OK」ボタンクリック時
●● = SetPage1.m_XXXX; //プロパティシートでの設定値を参照
}
◆基本クラスをCPropertySheetにしたクラスを作成して、コンストラクタでプロパティページを挿入したらもっとすっきりだな。
BOOL CXXXXXDlg::OnInitDialog()
{
CDialog::OnInitDialog();
…
CString WStr;
WStr.LoadString(IDS_WINDOW_TITLE);
SetWindowText(WStr);
…
}
BOOL CXXXXXApp::InitInstance()
{
…
//アプリケーションの二重起動防止
CreateMutex(NULL, TRUE, m_pszExeName);
if(GetLastError() == ERROR_ALREADY_EXISTS) {
CString WStr;
WStr.LoadString(IDS_ALREADY_EXISTS);
AfxMessageBox(WStr); //二重起動のメッセージ
WStr.LoadString(IDS_WINDOW_TITLE);
CWnd* pWnd = CWnd::FindWindow(NULL, WStr);
if( pWnd )
pWnd->SetForegroundWindow(); //最上位に
return FALSE;
}
…
}
//「ヘルプ」ボタン非表示
SetSheet.m_psh.dwFlags &= ~PSH_HASHELP;
SetPage1.m_psp.dwFlags &= ~PSH_HASHELP;
SetPage2.m_psp.dwFlags &= ~PSH_HASHELP;
//「適用」ボタン非表示
SetSheet.m_psh.dwFlags |= PSH_NOAPPLYNOW;
BOOL ret = ::AnimateWindow(this->GetSafeHwnd(), 800, AW_BLEND);
#define WINVER 0x0500
◆なぜか中央に表示されなかっけど、ダイアログのプロパティを開き「その他のスタイル」タブの「中央」にチェックを付けたら中央に表示された。
◆「OnApply」ってのもあるな。「OnOk」は「OK」ボタンのときも「適用」ボタンのときも呼ばれるのだな。それと「閉じる」もなのだな。
BOOL CXXXXXDlg::OnInitDialog()
{
…
if(・・・){ //エラーチェック
AfxMessageBox(・・・); //必要であればメッセージ表示
EndDialog(IDCANCEL); //関数を抜けたらダイアログを表示せずに終了する
return FALSE; //関数から抜ける
}
…
return TRUE; //TRUEを返すと…
}
BOOL CXXXXXDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN &&
(pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN))
return true; //何もしない
return CDialog::PreTranslateMessage(pMsg);
}
◆単に「キャンセル」ボタンを無効にすると、閉じるボタン(システムメニュー)も無効になってしまうので。
WINDOWPLACEMENT Pracement;
if(!pWnd->IsZoomed()){
//最大化状態でない
pWnd->GetWindowPlacement(&Pracement);
//最大化の設定
Pracement.showCmd = SW_SHOWMAXIMIZED;
pWnd->SetWindowPlacement(&Pracement);
}
void CXXXXXDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialogEx::OnShowWindow(bShow, nStatus);
・・・
//画面位置取得
GetWindowRect(MainWndRect);
}
void CXXXXXDlg::OnMoving(UINT fwSide, LPRECT pRect)
{
//OnShowWindowで取得した位置を設定
pRect->left = MainWndRect.left;
pRect->top = MainWndRect.top;
pRect->right = MainWndRect.right;
pRect->bottom = MainWndRect.bottom;
CDialogEx::OnMoving(fwSide, pRect);
}
void CXXXXXDlg::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
if(nType == SIZE_MINIMIZED){
//最小化された
・・・
}else if(nType == SIZE_RESTORED){
//元に戻された
・・・
}
}
ModifyStyle(0, WS_MINIMIZEBOX);
SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
HICON hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_XXXXX));
SetIcon(hIcon, FALSE);
//閉じるボタン無効
CMenu *pSysMenu = GetSystemMenu(FALSE);
pSysMenu->EnableMenuItem(SC_CLOSE, MF_GRAYED);
//閉じるボタン有効
CMenu *pSysMenu = GetSystemMenu(FALSE);
pSysMenu->EnableMenuItem(SC_CLOSE, MF_ENABLED);
//サイズ変更枠に設定
ModifyStyle(0, WS_THICKFRAME);
//ウィンドウサイズ変更不可
ModifyStyle(WS_THICKFRAME, 0);