のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:122,720,046人
910,640,931頁
昨日:3,707人
5,320頁
今日:2,280人
3,240頁
最近の注目
人気の最安値情報
    Page Top

    DialogベースでEnterキーを押すと終了してしまう

    ダイアログのプロパティ、オーバーライド、PreTranslateMessageで以下のメンバ関数を追加する。#br

    <pre>

    <pre>

    BOOL CShmooToolDlg::PreTranslateMessage(MSG* pMsg) {

    	// TODO : ここに特定なコードを追加するか、もしくは基本クラスを呼び出してください。
    	// ダイアログのデフォルト動作では、Enterによって終了してしまう。
    	if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
           return TRUE;
    	
    	return CDialog::PreTranslateMessage(pMsg);

    }

    </pre>

    または派生クラス内での仮想関数である OnOK()、OnCancel()を修正し、基本クラスの関数が 呼ばれないように変更します。 ボタンやメニューから、EndDialog(int exitcode) を呼び出すようにして終了手段を確保します。

    Page Top

    DialogベースでMenuItemが更新されない

    ダイアログのプロパティ、メッセージ、WM_INITMENUPOPUPで以下のメンバ関数を追加する。#br

    <pre>

    <pre>

    void CShmooToolDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) {

       CDialog::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
       // TODO : ここにメッセージ ハンドラ コードを追加します。
       CCmdUI        cmdUI;
       cmdUI.m_pMenu=pPopupMenu;
       cmdUI.m_nIndexMax=pPopupMenu->GetMenuItemCount();
       for (cmdUI.m_nIndex=0;cmdUI.m_nIndex<pPopupMenu->GetMenuItemCount();cmdUI.m_nIndex++) {
           if (!(cmdUI.m_nID=pPopupMenu->GetMenuItemID(cmdUI.m_nIndex))) continue;
           else if (cmdUI.m_nID==(UINT)-1) {
               cmdUI.m_pSubMenu=pPopupMenu->GetSubMenu(cmdUI.m_nIndex);
               if (!cmdUI.m_pSubMenu||!(cmdUI.m_nID=cmdUI.m_pSubMenu->GetMenuItemID(0))||
               	(cmdUI.m_nID==(UINT)-1))
               	continue;
               cmdUI.DoUpdate(this,FALSE);
           }
           else {
               cmdUI.m_pSubMenu=NULL;
               cmdUI.DoUpdate(this,cmdUI.m_nID<0xF000);
           }
       }

    }

    </pre>

    Page Top

    ウィンドウの最小のサイズを設定

    ダイアログのプロパティ、メッセージ、WM_GETMINMAXINFOで以下のメンバ関数を追加する。#br

    <pre>

    <pre>

    class CMyDialog : public CDialog {

       ...

    protected:

       CSize m_szMin;

    };

    BOOL CMyDialog::OnInitDialog() {

       CDialog::OnInitDialog();
       ...
       // 最小サイズを記録しておく
       CRect rc;
       GetWindowRect(&rc);
       m_szMin = rc.Size();
       ...

    }

    void CMyDialog::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) {

       if (m_hWnd) {
           lpMMI->ptMinTrackSize.x = m_szMin.cx;
           lpMMI->ptMinTrackSize.y = m_szMin.cy;
       }
       CDialog::OnGetMinMaxInfo(lpMMI);

    }

    </pre>

    Page Top

    モードレスダイアログの作成

    親と同じオーダー、親がアクティブなとき後ろに隠れるようにするには GetDesktopWindow()で作成する。

    <pre>

    <pre>

       CMyDlg* dialog = new CMyDlg();
       dialog->Create(CMyDlg::IDD, GetDesktopWindow());
       dialog->ShowWindow(SW_SHOWNORMAL);

    </pre>

    常に親より上で表示させるには、以下のようにする。

    <pre>

    <pre>

       CMyDlg* dialog = new CMyDlg();
       dialog->Create(CMyDlg::IDD);
       dialog->ShowWindow(SW_SHOWNORMAL);

    </pre>

    Page Top

    ダイアログのタイトルの変更

    <pre>

    <pre>

       dialog->SetWindowText("ここにタイトルを入れる");

    </pre>

    Page Top

    CBrush

    <pre>

    <pre>

    CBrush brush; //CBrushクラスのオブジェクトを作成 brush.CreateSolidBrush(RGB(0, 255, 0)); //CBrushクラスのメンバ関数を使う

    ソリッドブラシ CBrush brush(RGB(0, 255, 0));

    ハッチブラシ CBrush brush(HS_CROSSなど, RGB(255, 0, 255));

    HS_BDIAGONAL・・・左下がりの斜線 HS_CROSS・・・・・碁盤目 HS_DIAGCROSS・・・斜めの碁盤目 HS_FDIAGONAL・・・右下がりの斜線 HS_HORIZONTAL・・ 水平線 HS_VERTICAL・・・ 垂直線

    碁盤目とか斜線の間の地色は現在のバックグラウンドカラーが使われます。これを変更したい場合は CDC::SetBkColor virtual COLORREF SetBkColor( COLORREF crColor ); を使います。戻り値は直前のバックグラウンドカラーです。エラーの時は0x80000000となります。

    また、背景モードはOPAQUE(デフォルト・背景を塗りつぶす)とTRANSPARENT(背景はそのまま)があります。 TRANSPARENT にするとバックカラーを設定しても意味がありません。背景モードを変更するには CDC::SetBkMode int SetBkMode( int nBkMode ); を使います。これはテキスト、ハッチブラシ、ペンに影響を与えます。

    </pre>

    Page Top

    Visual C++でのテーブルの使用

    Grid Control at CodeProject からMFC Grid Controlをダウンロードしてきます。#br

     

    これをソースごと自分のプロジェクトに追加します。#br VC++7.1でコンパイルの通らないところがありますが、 型変換がポインタのところをintでキャストしているだけなので 正しいキャストに直して上げます。#br

     

    実際に使うには、#br カスタムコントロールを配置して、プロパティのClassにMFCGridCtrlと入れてください。#br IDは好みのIDをつけてください。#br この状態でこのコントロールに対する変数を追加します。#br そうすると以下の追加を行ってくれます。#br

    <pre>

    <pre>

    CGridCtrl m_gridAxis;

    DDX_Control(pDX, IDC_GRID_AXIS, m_gridAxis);

    </pre>

    以上でCGridCtrlが使えるようになります。

    Page Top

    CDialogにアクセラレータキー(ショートカットキー)の追加

    リソースビューからリソースの追加でAcceleratorを追加してあげます。#br

    • ID:呼び出したいメニューやボタンのID
    • 修飾子:大抵はCTRLで十分です
    • キー:キーボードのキー値です
    • タイプ:VIRTKEYを使います
    <pre>

    <pre>

    class CxxxDlg : public CDialog { ・・・中略・・・ private:

       HACCEL m_acl;

    };

    BOOL CxxxDlg::OnInitDialog(){

       CDialog::OnInitDialog();

    ・・・中略・・・

       //アクセラレータのリソースを読み込む
       m_acl = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));
       return TRUE;

    }

    BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg){

       // アクセラレータ
       if(m_acl != NULL){
           if(::TranslateAccelerator(m_hWnd, m_acl, pMsg)){
               return TRUE;
           }
       }
       return CDialog::PreTranslateMessage(pMsg);

    }

    </pre>

    Page Top

    DLL(Dynamic Link Library)の読み込み方

    DLL自身はVisual C++のウイザードからDLLを選べば簡単に作成できます。#br

     
    Page Top

    実行時にリンク(Load-Time)する場合:暗黙的リンク

    メリット:DLLのライブラリファイルさえあれば、コンパイラが自動的に「ロードの機能」を組み込んでくれる。#br デメリット:状況に合わせてDLLを選ぶということができません。#br デメリット:DLLが見つからなかった場合の対処方法が貧弱#br

     

    DLL作成時に作られる.libファイルを用意します。#br コンパイルとリンク時にはDLL自身がなくても大丈夫です。(実行時には当然必要)#br

     

    stdafx.hの下の方(//[添付]の上の行くらい)に、次の2行を追加してください。

    <pre>

    <pre>

     #pragma comment(lib, "ライブラリ名")
     #include <必要なヘッダーファイル>

    </pre>

    Page Top

    実行中にリンク(Run-Time)する場合:

    この方法だと「関数しか使えない」「めんどくさい」「危なっかしい」といったデメリットがある。#br

     

    関数の定義#br

    <pre>

    <pre>

     typedef 戻り値の型 (関数名)( 引数の型 );
     typedef BOOL (sndPlaySound)( LPCSTR, UINT );

    </pre>

    DLLのロード#br

    <pre>

    <pre>

    	HINSTANCE	hInst;
    	sndPlaySound	*pfnDllFunc;
    	hInst = ::LoadLibrary( "winmm" );	//DLLを読み込みます。
    	if( hInst == NULL )
    	{
    		MessageBox( "DLLをロードできませんでした。" );
    		return;
    	}
    	pfnDllFunc = (sndPlaySound *)::GetProcAddress( hInst, "sndPlaySoundA" );	//関数のアドレスを取得します。
    	if( pfnDllFunc == NULL )
    	{
    		MessageBox( "関数を取得できませんでした。" );
    		::FreeLibrary( hInst );       //DLLを解放します。
    		return;
    	}
    	pfnDllFunc( "Test.wav", 0x0001 | 0x0002 );	//音発生!
    	::FreeLibrary( hInst ); 

    </pre>

    Dumpbin.exeを使うことによってDLL中で定義されている関数を調べることができる。#br

     

    Dependency Walker というものでいろいろと調べることができる。#br (EXE/DLL にリンクしている DLL、インポートしている関数、 エクスポートしている関数などを表示する。 Visual C++ に付属しているツール)

    Page Top

    プロセスの環境変数の変更

    GetEnvironmentVariable() や SetEnvironmentVariable() 、 GetEnvironmentStrings()

    Page Top

    InstanceHandle

    Page Top

    MFC拡張DLL中

    AfxGetInstanceHandleで常にEXEのインスタンスを返してくれる。#br MFCはいつでも使える。#br 作成時に作られるAFX_EXTENSION_MODULEにインスタンスが格納されている。#br これを使えるようにヘッダーを書いてあげると良い。#br

    <pre>

    <pre>

    #ifdef _AFXDLL HINSTANCE __declspec(dllexport) GetXXXHInstance();

    #else HINSTANCE __declspec(dllimport) GetXXXHInstance();

    #endif

    #include "XXX.h" // 追加

    static AFX_EXTENSION_MODULE XXXDLL = { NULL, NULL };

    HINSTANCE GetXXXHInstance() // 追加 {

    	return ShmooToolDLL.hModule;

    }

    </pre> これで、メインEXEからでもDLLないからでもインスタンスへの参照が簡単にできる。#br

     

    使い方

    <pre>

    <pre>

    #include "XXX.h"

    ...

    BOOL CXXXTestApp::InitInstance() { ...

       HINSTANCE hInstApp = AfxGetResourceHandle(); // もともとのインスタンスを保持
       AfxSetResourceHandle(GetXXXHInstance());     // ダイアログリソースのあるDLLインスタンスに切り替え
       CXXXDlg dlg;                                 // ダイアログの作成
    	INT_PTR nResponse = dlg.DoModal();           // モードレスで表示
    	AfxSetResourceHandle(hInstApp);              // 元のインスタンスに戻す

    ... }

    </pre>

    Page Top

    MFCレギュラーDLL

    AFX_MANAGE_STATE(AfxGetStaticModuleState());#br でMFCが使えるようになる。#br AfxGetInstanceHandleはDLLのものを返してくれる。#br

    Page Top

    MFCを使ったDLLの種類

    MFCを使ったDLLには、ふたつのタイプがあります。#br  ひとつは「拡張DLL」で、上の設定をしたときにこのDLLが作製されます。#br  この「拡張DLL」は、DLLを使用するExeやDLLもMFCを使う時にのみ使うことができます。#br  もうひとつは「レギュラーDLL」で、「MFC の共有 DLL を使用」を選ぶことで作製できます。#br  これは内部的にMFCそのものを持っているため、DLLを使用するExeやDLLがMFCを使わなくても使用できます。#br  ここでは、DLLにリンクするExeファイルはMFCを使うので「拡張DLL」を作製します。#br


    トップ   凍結 差分 バックアップ 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
    Counter: 3293, today: 2, yesterday: 1
    初版日時: 2007-05-26 (土) 03:15:09
    最終更新: 2007-05-26 (土) 03:15:09 (JST) (3682d) by