MFC

CFtpConnection::OpenFile()使うとメモリリークする

MFC

OpenFile()で受け取ったCInternetFileのポインタはClose()した後、deleteする必要あるみたいどこにもそんなん書いてないんだけどな。

CMapの速度テスト

MFC

適当にテスト。 当然ながらKeyがlongでInitHashTable()したやつがいっちゃん速かった。 Key:CStringと比べて数倍早い // Key:CStringでInitHashTable()なし // CString keyがループの中 { long tick = GetTickCount(); CMap<CString ,LPCTSTR,long,long& > mapdata; for(int i=0;i<1000000;</cstring>…

MFCでダイアログにポップアップメニューをつける方法

MFC

リソースエディタでメニュー作って以下のようなコードで呼び出す。 // "右クリック" void CMenuDlg::OnRButtonUp(UINT nFlags, CPoint point) { CMenu *popupMenuP = NULL; CMenu cMenu; int err = 0; // メニューをロード if (!err) if (!cMenu.LoadMenu(ID…

ON_NOTIFYで登録されてるアイテムにメッセージを飛ばす

MFC

ON_NOTIFY(LVN_ITEMCHANGED, ..., ...)で登録されている場合 NMHDR nmhdr; nmhdr.code = LVN_ITEMCHANGED; nmhdr.idFrom = controlId; nmhdr.hwndFrom = controlWindowHandle; SendMessage( targetWindowHandle, WM_NOTIFY, controlId, &nmhdr );ネタ元 http…

CListCtrlでアイテムをフォーカス&選択状態にする

MFC

SetItemState(nItem, // フォーカス&選択状態にしたいアイテムのインデックス LVIS_FOCUSED | LVIS_SELECTED, // 状態 LVIS_FOCUSED | LVIS_SELECTED); // マスクネタ元 http://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+200209/02090112.txt

mfcで画面を強制的に再描画させる方法

mfc

問答無用なら InvalidateRect(0,0,false); //画面全体に再描画を要求ウインドウハンドルしていすれば、そのアイテムだけ再描画するネタ元 http://okwave.jp/qa/q112210.html

CFile::Openでファイルオープン時にファイルが存在しないなら作成、するなら内容そのままにはmodeCreate | modeNoTruncate

MFC

modeCreateだけだと中身クリアされるよ CFile::modeCreate | CFile::modeNoTruncateネタ元 http://www.g-ishihara.com/mfc_fi_01.htm

MFCで数日前/数分前の日時計算

MFC

COleDateTime と COleDateTimeSpan を使います。 #include <afxdtctl.h> // MFC の Internet Explorer 4 コモン コントロール サポート int yy1,mm1,dd1; int yy2,mm2,dd2; int nNissuu; COleDateTime tsKjn(yy1,mm1,dd1,0,0,0); // 基準日 // COleDateTime tsKjn = COleDateTime::Ge</afxdtctl.h>…

CInternetFile::GetLength()は今読み込めるサイズが返ってくる!

MFC

MSDNには「ファイルのサイズを返します。」としか書いてないが、実は今読める分のサイズが返ってくるだけで、必ずしもファイルサイズを表してるわけではない。なので返ってくる値が0になるまで繰り返し読み込む必要がある CInternetFile *p_if_obj; p_if_obj…

MFCで一番簡単なマウス砂時計にする方法

宣言するだけ CWaitCursor wc;関数やスコープ抜けるところで元に戻る 簡単。ネタ元 http://park1.wakwak.com/~ima/visualcpp_tips0006.html

MFCでメニューにある自分の機能呼び出し

MFC

PostMessage (WM_COMMAND,ID_MENU_ITEM01);って感じ

MFCでutf-8のファイルから一行文字列読み取り

mfc

fopen()で開いて CStdioFile にポインタ渡して読み込む。 直CStdioFileで読むとShift-jisになっちゃう。 CString sPath; FILE *fp; errno_t ferr; ferr = _tfopen_s(&fp,_T("C:\\text.txt"), _T("r, ccs=UTF-8")); if( 0 == ferr ){ CStdioFile sFile(fp); s…

Enterキー(Escキー)を押しても、ダイアログが閉じないようにするには

MFC

ダイアログのクラスのPreTranslateMessage関数で、VK_RETURN、VK_ESCAPEをキャッチし、CDialogの実装の処理が行なわれないようにします。 BOOL CXXXDialog::PreTranslateMessage(MSG* pMsg) { if( WM_KEYDOWN == pMsg->message ) { switch( pMsg->wParam ) {…

CMenuの項目を消すにはRemoveMenu

MFC

ID指定の場合 CMenu menu,*pPopup; VERIFY( menu.LoadMenu( IDR_TASKTRAY_MENU )); pPopup = menu.GetSubMenu( 0 ); pPopup->RemoveMenu(ID_MENU_ITEM1,MF_BYCOMMAND);何番目か指定の場合 pPopup->RemoveMenu(3,MF_BYPOSITION); ネタ元 https://msdn.microso…

CEditで複数行OKにする設定メモ

MFC

項目 値 意味 MultiLine True 複数行 Want Return True 改行したい(改行を許可) Auto HScroll False 水平自動スクロールせず Vertical Scroll True 垂直スクロールバー ネタ元 http://mail2.nara-edu.ac.jp/~asait/visual_cpp/dialog1/editbox2/editbox2.htm

CEditやCRichEditで最下方にスクロールする

MFC

スクロールバーにメッセージを送るスクロールバーの性質上、一番下にスクロールすると、最後の行がコントロールの一番下の位置に表示されるのです。 // 最終行が表示されるようにスクロールする edit.PostMessage(WM_VSCROLL, MAKELONG(SB_BOTTOM, NULL));ネ…

CEditで文字グレーにしないで編集不可にする

MFC

CEdit::SetReadOnly()で読取専用にする方法を使う背景白にはならないけど、文字がグレーにはならないから見やすいネタ元 http://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+200211/02110075.txt

CEditで65535文字の限界を超える

MFC

SetLimitText(0)すればOK CWnd* pWnd = dlg.GetDlgItem(nItemId); CEdit *edit = static_cast<CEdit*>(pWnd); //dynamic_cast does not work if(edit != 0) { UINT limit = edit->GetLimitText(); //The current text limit, in bytes, for this CEdit object. //val</cedit*>…

CRichEditCtrlを使うにはLoadLibrary()する必要あり

MFC

リソースエディタで普通に張るだけだと、DoModal()でなにもおきない。 起動時に m_hRichDll = LoadLibrary(_T("Riched20.dll"));終了時に FreeLibrary(m_hRichDll);ネタ元 http://www16.atpages.jp/rayna/Tips/richedit/index.html

CMapのループ

MFC

CMap<CString, LPCTSTR, CPerson*, CPerson*> myMap; CPerson myPerson; myMap.SetAt(_T("Bill"), &myPerson); POSITION pos = myMap.GetStartPosition(); while(pos != NULL) { CPerson* pPerson; CString string; // Get key (string) and value (pPerson) myMap.GetNextAssoc(pos, string, pPers</cstring,>…

ディレクトリ(フォルダ)をコピーする

実装方法としては、 ・ディレクトリの中のファイルをコピーする処理を作成する方法 ・シェル関数を用いる方法 の2つの実現実装方法があります。API版 BOOL CopyDirectory( LPCTSTR lpExistingDirectoryName, LPCTSTR lpNewDirectoryName ) { // 入力値チェ…

ファイルが更新されてるかどうかチェック

MFC

CTime g_Time; ... TCHAR tcFile[MAX_PATH] = _T("d:\log.txt"); CFileFind find; if(find.FindFile(tcFile)) { find.FindNextFile(); CTime updateTime; find.GetLastWriteTime(updateTime); find.Close(); if( g_Time.GetTime() == updateTime.GetTime() )…

(C++)現在のログインしてるユーザ名を取得する

Windows API の GetUserName関数 を使えばいいようです。 //現在のユーザ名取得 TCHAR user[1024]; DWORD dwUserSize; // 取得したユーザ名の文字列の長さ if ( ! GetUserName(user,&dwUserSize) ){ return -1; } MessageBox(NULL,user,_T("ユーザ名"),MB_OK…

メモリマップドファイルのサイズ変更のつもりでCloseHandle()してからCreateFileMappingしても同じ名前じゃ意味が無い

名前変えないと、結局前作ったハンドルが返ってくる。サイズも変わってない。プロセスを落とすまでそうなるらしい。 ひょっとして、同じ名前(今回の場合は、"MAPFILE")で 異なるサイズのオブジェクトを作成しようとしたりしていませんか?ネタ元 http://hp…

ファイルが残っているフォルダを削除

コツコツファイル消してからRemoveDirectory()が正攻法だとおもうけど、シェル関数を使うと楽。間違って大事なフォルダ消しちゃわないようにデバッグ時は要注意だよ。 BOOL DeleteDirectoryUseShellFunc( LPCTSTR lpPathName ) { // 入力値チェック if( NULL…

MessageBoxのはい/いいえ/キャンセルの文字を変更する

MFC

SetWindowsHookEx()/UnhookWindowsHookEx()を使ってフックして対応 ////////////////////////////////////////////////////////////////// // フックハンドル用の変数をグローバルで宣言する。 HHOOK MyHookHandle; // フックハンドル変数 // OKの文字列と、…

MFC アプリケーションを終了する方法

MFC

// same as double-clicking on main window close box ASSERT(AfxGetMainWnd() != NULL); AfxGetMainWnd()->SendMessage(WM_CLOSE);ネタ元 http://support.microsoft.com/kb/117320/ja

メッセージ送ってボタンを操作する

MFC

ボタンをプログラムからクリックするには BM_CLICK を使います これをボタンに送れば、ボタンは WM_LBUTTONDOWN と WM_LBUTTONUP メッセージを受け取りますBM_CLICK のパラメータは両方とも 0 です また、このメッセージに戻り値はありませんまた、プッシュ…

Windowsアプリで引数を受け取る

MFC

CString cmdParam( m_lpCmdLine );で取れるサンプル { // コマンドライン引数の取得 CString cmdParam( m_lpCmdLine ); cmdParam.Trim(); CStringArray cmdParams; // 引数を格納する動的配列 CString param; int curPos = 0; // パラメータの分解 cmdParam.…

CMapを高速に使うためには

初期サイズを定義する SetAtではなく[]を使う 不得意分野では使わない 単純にすべてを羅列するような使い方の場合はCMapではなく、CArrayなどを検討したほうがいいです。 ネタ元 http://www.mfc-programming.com/2010/etc/mfc248.html