2007年3月13日 (火)

ON_UPDATE_COMMAND_UI を使う

WM_KICKIDLE メッセージをつかうためのヘッダをインクルード。

#include <afxpriv.h> // for WM_KICKIDLE

メッセージマップを追加する。

afx_msg LRESULT OnKickIdle(WPARAM wp, LPARAM lp);

ON_MESSAGE(WM_KICKIDLE, OnKickIdle)

LRESULT CMyDlg::OnKickIdle(WPARAM wp, LPARAM lCount)
{
    UpdateDialogControls(this, TRUE);
    return 0;
}

【ひな型】
http://hp.vector.co.jp/authors/VA010286/sw/mfc/mydlg.cpp.html
http://hp.vector.co.jp/authors/VA010286/sw/mfc/mydlg.h.html

|

2007年1月19日 (金)

CFileDialog で複数選択

受け取りバッファの設定が必要です。

CFileDialog dlg(TRUE);
dlg.m_ofn.Flags |= OFN_ALLOWMULTISELECT;
TCHAR pszFile[0xffff] = { 0 };
dlg.m_ofn.lpstrFile = pszFile;
dlg.m_ofn.nMaxFile = 0xffff;
if (dlg.DoModal() == IDOK)
{
    POSITION pos = dlg.GetStartPosition();
    while (pos)
    {
        /* 何か処理 */
        AfxMessageBox(dlg.GetNextPathName(pos));
    }
}

|

2007年1月15日 (月)

二重起動の防止

#include <afxmt.h>

BOOL CMyApp::InitInstance()
{
    // アプリケーションの二重起動防止
    CMutex mutex(FALSE, m_pszExeName);
    if (!mutex.Lock(0)) return FALSE;
    ...
    ...
    mutex.Unlock();
    return FALSE;
}

|

フォーカスの移動

1. ダイアログ内の指定したコントロールにフォーカスを移動

GotoDlgCtrl(GetDlgItem(IDC_EDIT1));
// 違いはよく分からないが作法としては上記の方がよさそう
GetDlgItem(IDC_EDIT1)->SetFocus();

2. ダイアログ内の次のコントロールにフォーカスを移動

NextDlgCtrl();

3. ダイアログ内の直前のコントロールにフォーカスを移動

PrevDlgCtrl();

|

2005年11月 9日 (水)

ドロップされたファイル名の取得

ダイアログの拡張スタイルで「ドラッグ ドロップを許可」をチェックすること。

void CMyDlg::OnDropFiles(HDROP hDropInfo) 
{
    UINT nFiles = ::DragQueryFile(hDropInfo,
                                  (UINT)-1, NULL, 0);     for (UINT iFile = 0; iFile < nFiles; iFile++)     {         TCHAR pszFileName[MAX_PATH];         ::DragQueryFile(hDropInfo, iFile,
                        pszFileName, MAX_PATH);
        // 何かの処理を行う         AfxMessageBox(pszFileName);     }     ::DragFinish(hDropInfo); }

【参考リンク】
C++ Q & A -- Microsoft Systems Journal July 1997

|