2017-11

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

メッセージボックスについて

MessageBoxは3種類くらいある。
//CWindow::MessageBox & CWnd::MessageBox
int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType = MB_OK );

//Win32API
int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);

//Afx
int AfxMessageBox(LPCTSTR lpszText ,UINT nType =MB_OK,UINT nIDHelp =0); 
int AFXAPIAfxMessageBox(UINT nIDPrompt ,UINT nType =MB_OK,UINT nIDHelp =(UINT)-1); 

使用例↓
//CWindow::MessageBox & CWnd::MessageBox
MessageBox("内容");
MessageBox("内容" , "タイトル" , MB_OK);

//Win32API
MessageBox(NULL , "内容" , "タイトル" , MB_OK); 

 クラスによって上の例は使える時と使えない時がある。
 デバックの時とかに取り合えず、何か表示したい時は次のようにすれば、グローバルのMessageBox(Win32APIのほう)を呼ぶので大体表示できる。最初の”::”が重要。
 後から気づいたんだけどAfxのメッセージボックスならもっと短くいけそう。。
//Win32API
::MessageBox(NULL , "内容" , "タイトル" , MB_OK);

//Afx
AfxMessageBox("内容"); 

 ↓みたいにやっとくと、値を見たいけどデバッガ使うのがメンドイ感じのデバック用に便利かも。
CString text;
text.Format("count = %d" , count);
AfxMessageBox(text); 

スポンサーサイト

#pragmaを使用したライブラリのリンク

 VCでは普通、ライブラリのリンクはメニューのプロジェクト>設定>・・・って感じで設定するけど、この1行をヘッダの頭に入れておけば設定しなくてもリンクされる。DLLのリンクでも同様に使うらしい。
#pragma comment(lib, "xxx.lib")

モードレスダイアログボックスを作る

 モードレスダイアログボックスってのは親ウィンドウにも入力可能なダイアログボックス。親に入力できないのはモーダルダイアログボックス。

 モードレスダイアログボックスの作り方の最小限の手順は以下の通り。
1.ダイアログエディタで普通にダイアログを作成し、そのクラスも作成する。
(例としてクラスをCDlg1とする)
2.CDlg1のインスタンスを生成。
3.CDlg1のメンバ関数内でCDialog::Create(CDlg1のダイアログID , (※親ウィンドウオブジェクトのポインタ))を呼ぶ。
(CDlg1::IDDで自分のダイアログID)

 例①:Modelessというメンバ関数を作ってそこで親ウィンドウオブジェクトのポインタを渡している。
//親クラスでインスタンス(モードレスの場合はメンバ変数とかにしないと消えるよ)
CDlg1 Dlg1; 

//親クラスからの呼び出し
Dlg1.Modeless(this); 

//CDlg1クラス内のメンバ関数でCDialog::Create()の呼び出し
void CDlg1::Modeless(CWnd *pParent)
{
    CDialog::Create(CDlg1::IDD , pParent);
}

//消す時はこんな感じ。もう一度作る時はCDialog::Create()を呼べばOK
void CDlg1::OnOK()
{
    DestroyWindow();

例②:コンストラクタ内で作ってしまう場合。また、new、deleteを使ってみる。

//親クラスのメンバ変数にCDlg1クラスのポインタを作っておく
CDlg1 *Dlg1; 

//親クラスでインスタンスの生成
Dlg1 = new CDlg1(this); 

//CDlg1クラス内のコンストラクタ内でCDialog::Create()を呼ぶ。
void CDlg1::CDlg1(CWnd *pParent) : CDialog(CDlg1::IDD , pParent)
{
    //{{AFX_DATA_INIT(CDlg1)
        // メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
    //}}AFX_DATA_INIT
    
    CDialog::Create(CDlg1::IDD , pParent);

//最後に親クラスでDestroyWindow() と delete とか
Dlg1->DestroyWindow(); 
delete Dlg1; 

 意外と簡単で、ダイアログとかを普通に作ってそのメンバ関数の中でCDialog::Create()を呼ぶだけ。CDialog::Create()をCDlg1のメンバ関数内で呼ぶのは、親クラスで呼ぶとなぜかエラーになる。やってることは一緒だと思うんだけど、よくわからん。

 CDialog::Create()した状態でもう一度CDialog::Create()するとエラーになるけど、DestroyWindow()は、もう一度DestroyWindow()してもエラーにならないので、うまく使えばいいかも。

 ちなみに、親クラスのメンバ変数にCDlg1のインスタンスを持たせておいて、例2のようにCDlg1のコンストラクタ内でCDialog::Create()を行うと、親ウィンドウがない状態になり、もう一つ普通に違うダイアログが出た状態になる。重なりの順位が変えられるのと、タスクバーにアイコンがもう一つ出るところが違う。

色の設定なんかのマクロとか

 MFCというかWin32SDKでは色の設定なんかを行うときにCOLORREF型というものを使う。COLORREF型を使いたいときは、RGBそれぞれの成分値との変換のマクロがあるので大体それを使う。

 COLORREF型:カラー値として使われる 32 ビット値。(DWORD)
//RGBの成分からCOLORREF型へ
COLORREF RGB(BYTE bRed, BYTE bGreen, BYTE bBlue);

//COLORREF型からRGBの成分へ
BYTE GetRValue(COLORREF rgb); //赤
BYTE GetGValue(COLORREF rgb); //緑
BYTE GetBValue(COLORREF rgb); //青 

 ちなみにCOLORREF型はDWORDで4バイトなのでその中身は、最初の1バイトが常に0(使わない)、それからB成分、G成分、R成分の順となる。
 COLORREF型どうしを足したり引いたりして計算できる。その時は各成分0~255じゃないとおかしくなるので注意。クラスでもないので範囲制限してくれたりしない。

プリントスクリーンのやり方

GetDesktopWindow()でデスクトップウィンドウをゲットして、更にそのデバイスコンテキストをゲットする。んで、これを描きたいDCにコピるだけ。
CRect rect;
GetDesktopWindow()->GetWindowRect(rect); //デスクトップのサイズ
CDC *wdc = GetDesktopWindow()->GetWindowDC(); //デスクトップのDC
dcMem.BitBlt(00, rect.Width(), rect.Height(), wdc, 00, SRCCOPY);

自分のウィンドウを写したくないときとかは、直前に最小化とかするなり適当に対処すればいいんじゃない?

«  | HOME |  »

プロフィール

ku_470

Author:ku_470
HP

FLVP (FLVプレイヤー)
Vector
説明

カテゴリー

最近の記事

最近のコメント

最近のトラックバック

FC2カウンター

リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。