MicrosoftFoundationClass ( MFC )

デフォルトのビューをフォームにしたい AppWizardのステップ 6/6 で CxxxViewの基本クラスを CFormView に変更する。 メニューはいらない View::OnInitialUpdateで // メニュー非表示 ::SetMenu(AfxGetMainWnd()->m_hWnd,NULL) ; タイトルバー文字列を設定 View::OnDrawで? // タイトルバー文字列設定 AfxGetMainWnd()->SetWindowText( "title") ; ウィンドウサイズを設定する CMainFrame::PreCreateWindow で cs.cx = 1024; cs.cy = 768; を設定する。 任意のダイアログを表示 リソース・dialog・ダイアログの挿入・IDD_XXX クラスの新規作成で CDialogクラスを追加する 使用する cpp で #include "XXXDlg.h"; する。 CXXXDlg cXXXDlg; でオブジェクトを生成 cXXXDlg.DoModal() ; でダイアログを表示 アプリケーションを終了 AfxGetMainWnd()->PostMessage(WM_CLOSE, 0, 0); メンバー変数にセットした文字列を表示 m_edit = "れれれのれ"; UpdateData( FALSE); CString に文字列連結 cstr += "れんけつ"; ファイルを開くダイアログ CFileDialog dlg( TRUE,,,); if( IDOK == dlg.DoModal() ){ } CEdit でタブ文字が「・・・」とか表示されてしまう CEdit* e=(CEdit*)GetDlgItem( IDC_EDT); e->SetTabStops( 16); CEdit で改行されない? // \n ではNG。\r\n で改行される。 // http://www.page.sannet.ne.jp/mtoga/lang/cv/bih-m_11.htm CString cstr; while( NULL != fgets( buff, sizeof(buff), fp)){ cstr = buff; cstr.Replace( "\n", "\r\n"); m_edt += cstr; UpdateData( FALSE); } CEdit のフォントを変更する LOGFONT lf; CFont f; CFontDialog fdlg( &lf); if( fdlg.DoModal() == IDOK){ f.CreateFontIndirect( &lf); e->SetFont( &f, TRUE); } ウィンドウにあわせてリサイズ フォームに配置したコントロールの大きさを ウィンドウのリサイズにあわせて変えるには OnSize にコードを追加する。 CEdit* e=(CEdit*)GetDlgItem( IDC_EDT); // OnSize はフォームに配置されるコントロールが // ウィンドウとしてまだ作成されていないときに // 発生するためチェックが必要 if( e != NULL ){ rect.left=16; rect.top=16; rect.bottom=cy - 16; rect.right=cx - 32; e->MoveWindow( &rect, TRUE); } アイコンを変更したい アイコンエディタで編集してもタスクリスト(alt+tab)の アイコンがかわるだけでタスクバー、ウィンドウ左上の アイコンはMFCアイコンのまま ↓ アイコンエディタのデバイスで 16x16 を選択して こちらも編集する。 メニュー・ファイル・開く に対応する処理 http://www.ccad.sccs.chukyo-u.ac.jp/manualc/prgrm/mfc/index23.htm ClassWizard CxxxView ID_FILE_OPEN COMMAND で関数の追加( OnFileOpen ) CString cstr; FILE *fp; char buff[1024]; CEdit* e=(CEdit*)GetDlgItem( IDC_EDT); e->SetTabStops( 16); memset( buff, 0, sizeof(buff)); CFileDialog dlg( TRUE, "txt", NULL, NULL, NULL); if( IDOK == dlg.DoModal() ){ AfxGetMainWnd()->SetWindowText( dlg.GetPathName() ); fp = fopen( dlg.GetPathName(), "r"); if( NULL!=fp){ while( NULL != fgets( buff, sizeof(buff), fp)){ cstr = buff; cstr.Replace( "\n", "\r\n"); m_edt += cstr; UpdateData( FALSE); } fclose( fp); }else{ m_edt = "can't open."; } } 名前を付けて保存 のダイアログ // 最初の引数を FALSE にします。 CFileDialog dlg( FALSE); if( IDOK == dlg.DoModal() ){ AfxGetMainWnd()->SetWindowText( dlg.GetPathName() ); CFile file; if(file.Open( dlg.GetPathName(), CFile::modeCreate | CFile::modeWrite)){ file.Write( m_edt, m_edt.GetLength()); } } エディットボックス最下行表示 CEdit* e=(CEdit*)GetDlgItem( IDC_EDT); e->LineScroll ( e->GetLineCount(), 0); メッセージボックスを表示 AfxMessageBox( cstr, MB_OK, 0); ドロップされたファイルを開く 1.StdAfx.hに #include // ドロップ有効 2.CxxxView にメンバー変数 COleDropTarget m_dropTarget; // ドロップ有効 3.CxxxApp::InitInstance() に m_pMainWnd->DragAcceptFiles( TRUE); // ドロップ有効 を追加して Serialize で読み込めばOK ドキュメントに変数を追加 Doc public に 変数を用意する この内容が変化すれば CxxxView::OnUpdate が発生する CEditの上限 NT系:特になし 95系:65535バイト(UINT_MAX, ) テキストファイルをSerializeで読み込み try{ while( ar.ReadString( cstr) ){ m_csLines += cstr; m_csLines += "\r\n"; } }catch( CArchiveException* e ){ } ドキュメントが更新されたとき CxxxView::OnUpdate m_xxx = GetDocument()->m_csLines; UpdateData( FALSE); 複数のファイルがドロップされたとき Serialize で読み込めば可 ただし デスクトップのアイコンにドロップした場合は ひとつのファイルしか開かない。 名前を付けて保存を実装する リソースのメニューから 名前を付けて保存で右クリック ClassWizardで CxxxDoc ID_FILE_SAVE_AS Command 関数の追加 コード編集 最大化(フルスクリーン)表示 CMainFrame::OnCreateに以下を追加 HMENU m_hMenu; // WS_CAPTION と WS_THICKFRAME スタイルを取り除く ModifyStyle(WS_CAPTION | WS_THICKFRAME, 0); // メニューを取り除く m_hMenu = ::GetMenu(GetSafeHwnd()); SetMenu(NULL); // 最大表示する ShowWindow(SW_MAXIMIZE); http://nt.sakura.ne.jp/~miwaki/progtips/mfc/fullscreenmode.shtml ステータスバーを非表示に ShowControlBar(&m_wndStatusBar, FALSE, TRUE); ステータスバーはやっぱりいらない CStatusBar m_wndStatusBar; if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Failed to create status bar\n"); return -1; // 作成に失敗 } メニューから表示・ステータスバー を削除する。 一度に複数のプロジェクトを開きたい Explorer ツール・フォルダオプション・dsw・詳細設定 Open with MSDev 編集 DDE を使わない に設定する。 VCのサービスパックのバージョン HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\6.0\ServicePacks スライダーコントロール OnReleasedcaptureSlider1で CSliderCtrl* s=(CSliderCtrl*)GetDlgItem( IDC_SLIDER1); i=s->GetPos(); で値が取得できる。 s->SetRange( 0, 6, TRUE); で値の範囲を設定できる。 ★キーボードから操作したときは? プログレスコントロール CProgressCtrl* p=(CProgressCtrl*)GetDlgItem( IDC_PROGRESS1); p->SetRange( 0, 500); で値の範囲を設定できる。 p->SetPos( g_exec1); で表示を設定できる。 スレッド作成 Viewにメンバー関数の追加 UINT thread( void *pParam) staticにチェック CWinThread* m_pthread1; viewのコンストラクタで m_pthread1 = AfxBeginThread( thread1, 0, THREAD_PRIORITY_NORMAL, 0, 0, NULL); 削除してもよいファイル @REM mfcdiet.bat @REM MFC が作成する中間ファイルをすべて削除する del *.aps del *.clw del *.ncb del *.opt del /Q .\Debug\*.* del /Q .\Release\*.* // Windows NT をシャットダウンする BOOL CxxxView::ExitWindowsNt() { HANDLE htkThread; TOKEN_PRIVILEGES tkPriv; BOOL bRet; // プロセスに関連付けられたアクセストークンをオープンする bRet = OpenProcessToken(GetCurrentProcess(), // handle to process TOKEN_ADJUST_PRIVILEGES, // desired access to process &htkThread // pointer to handle of open access token ); if (bRet == FALSE) { return FALSE; } // 追加(変更)する特権の数 tkPriv.PrivilegeCount = 1; // ローカルシステム内の SE_SHUTDOWN_NAME 特権の LUID を取得する bRet = LookupPrivilegeValue(NULL, // address of string specifying the system SE_SHUTDOWN_NAME, // address of string specifying the privilege &tkPriv.Privileges[0].Luid // address of locally unique identifier); ); if (bRet == FALSE) { return FALSE; } // 特権を使用可能にする設定をする tkPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; // アクセストークンに特権情報を追加する bRet = AdjustTokenPrivileges(htkThread, // handle to token that contains privileges FALSE, // flag for disabling all privileges &tkPriv, // pointer to new privilege information 0, // size, in bytes, of the PreviousState buffer NULL, // receives original state of changed privileges NULL // receives required size of the PreviousState buffer ); if (bRet == FALSE) { return FALSE; } // シャットダウンを行う ExitWindowsEx(EWX_SHUTDOWN, 0); return TRUE; } ファイル開くで複数選択 OFN_ALLOWMULTISELECT CString path; POSITION pos= test_dlg.GetStartPosition(); do{ path = test_dlg.GetNextPathName(pos); TRACE("%s\n",path); }while(pos != NULL); ビットマップを表示して動的にビットマップを変更する リソース・挿入・ビットマップで IDB_BITMAP1 とIDB_BITMAP2 を作成 フォームにピクチャーを貼付 プロパティ・一般・タイプをビットマップに設定する。 ID:とイメージを IDB_BITMAP1 に設定 ClassWizardでメンバ変数追加、カテゴリ:コントロール(CStatic) m_bmp を作成 CStatic m_bmp; m_bmp.ShowWindow(SW_SHOW); // 表示 m_bmp.ShowWindow(SW_HIDE); // 非表示 CBitmap b; b.LoadBitmap( IDB_BITMAP2); m_bmp1.SetBitmap( (HBITMAP)b); Beepを鳴らす BOOL MessageBeep(UINT uType); 例:uType = 0xFFFFFFFF クラス情報読み込み失敗 .ncb を削除して .dswを開きなおす アプリケーションログへの記録 RegisterEventSource ReportEvent DeregisterEventSource

関連サイト

  1. #pragma twice ( 結構、how-to 網羅されてます
    http://www.kab-studio.biz/Programing/PragmaTwice/index.html
  2. VC++ML 検索 ( 速いです
    http://shinobu.acty-net.ne.jp/mfc_search/
  3. VC++ML
    http://mfc.acty-net.ne.jp/ml/mfc/
  4. VC++超初心者のHP
    http://cgi.members.interq.or.jp/gold/marken/
  5. VC++超初心者のHP 過去ログ ( 遅いです
    http://cgi.members.interq.or.jp/gold/marken/oldlog.htm
  6. MAGURO ONLINE
    http://www2s.biglobe.ne.jp/~maekawa/index.html

since 04/10/09(sat)


©