MFC

WinInetによるインターネット上ファイルの読み込みサンプル

MFC

超簡単サンプルです。ファイルの全部読み込みとか なーんもやってない。 { LPTSTR lpszBuf=(LPTSTR)GlobalAlloc(GPTR,1024); /* ハンドル作成 */ HINTERNET hInet=InternetOpen(_T("TEST"),INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0); /* URLオープン */ HINTE…

背景色を指定するにはSetBkColor()関数

MFC

SetBkColor(hdc , RGB(0xFF , 0 , 0));ネタ元 http://wisdom.sakura.ne.jp/system/winapi/win32/win21.html

MFC メモリデバイスコンテキストに文字列を出力

MFC

/************************************************* 関数名 DrawStringToHDC 機能 メモリデバイスコンテキストに文字列を出力 iXsize : 出力画像の幅(Width) iYpos : 縦方向の出力位置 *************************************************/ void DrawStrin…

MFC プログラムで画像を描いてイメージリストに追加するサンプル

MFC

// 日の丸を作成 // メモリ上にデバイス独立ビットマップを(DIB)作成する。 ZeroMemory(&bmp,sizeof(bmp)); bmp.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bmp.bmiHeader.biBitCount=32; bmp.bmiHeader.biPlanes=1; bmp.bmiHeader.biWidth=IMAGE_WIDTH; b…

MFCオリジナルのメッセージを受信する

MFC

#define WM_ORIGINALMSG WM_USER+1000って感じでメッセージ作るネタ元 http://i-hptetsu.programming.jp/archives/519

CLIstCtrlでドラッグ&ドロップする

MFC

まだ実装中。いいサンプルはこれ http://www50.tok2.com/home2/StillGreen/knowledge/program/listview.htm LVS_系のメッセージ受け取るにはSetExtendedStyleでLVS_REPORT指定してないとだめ https://msdn.microsoft.com/ja-jp/library/2hxsby1h.aspx ネタ元…

CMenuでメニュー項目の文字列を動的変更

MFC

SetMenuItemInfoで変更できます。 TCHAR buf[] = TEXT("新メニュー文字列"); MENUITEMINFO mii = { sizeof(mii) }; mii.fMask = MIIM_STRING; mii.dwTypeData = buf; pMenu->SetMenuItemInfo(2, &mii, TRUE);セパレータも意識して項目の順番指定してね。 Set…

MFCでキュー(FIFO)配列クラス作成

MFC

標準ではないので、CTypedPtrListを使って作るAddToEnd()で追加してGetFromFront()で取得。 // キュークラス // AddToEnd()にはnewしたオブジェクトを渡して // GetFromFront()した後はコール元でdeleteすること。 class CMyQueue : public CTypedPtrList< C…

EnableMenuItemでメニュー項目の有効/無効などの切り替えが効かない時はここを見れ

MFC

1.CFrameWndクラスのm_bAutoMenuEnableメンバがTRUEなってないかチェック2.BEGIN_MESSAGE_MAPの中にON_UPDATE_COMMAND_UIの指定が無いかチェック 上記があるといくら設定しても効きません。ネタ元 http://specialprovidence.at.webry.info/201007/article_72…

URLをブラウザで開く

mfc

ShellExecute()を使ってURL文字列をopenするだけ bool OpenUrl(LPCTSTR lpszUrl) { HINSTANCE hInst = ShellExecute(NULL,"open",lpszUrl,NULL,NULL,SW_SHOWNORMAL); if(hInst < (HINSTANCE)32){ // 32未満は起動に失敗 return false; } retuen true; } ネタ…

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::</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

CMAPの定義例

CMap< int, int, MY_STRUCT, MY_STRUCT& > myMap1;この例は MY_STRUCT 値を格納し、 int のキーにアクセスし、参照によって MY_STRUCT のアクセスされた項目を返します。 CMap< CString, LPCTSTR, CPerson, CPerson& > myMap2;この例では CPerson 値を格納し…

std:string(shiftjis/ansi)からCString(unicode)に変換する簡単な方法

CStringAに入れてからCStringに突っ込む。直変換するより、メモリや処理速度の効率は良くないと思うよ。 std:string str_sjis; str_sjis = "abc"; CStringA mess; mess.Format("%s",str_sjis.c_str()); CString mess2; mess2 = mess; AfxMessageBox(mess2);

vector以外の動的配列 CArray / CAtlArray

例えば128個の配列を確保するときそれぞれ次のようにコーディングすることができます。(この他にも方法はありますが) CArray < int > a; a.SetSize( 128 ); CAtlArray < int > b; b.SetCount( 128 );ネタ元 VC++、CArray、CAtlArray、vector、配列の違い | …

MFCでファイルの更新日付取得

[vc][mfc] CFileFind find; if(find.FindFile(tmpFilepath)) { find.FindNextFile(); CTime updateTime; find.GetLastWriteTime(updateTime); find.Close(); } ネタ元 http://oissu2.blog77.fc2.com/blog-entry-28.html

2次元配列のやりとりを考える

MFCつかったC++からVB.NETのDLL内のAPIとでやりとり調査中キーワード:マーシャリング http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200309/200309_03090033.html http://msdn.microsoft.com/ja-jp/library/9b1fy41s.aspx http://rarara.cafe.coocan.jp/cgi…

C#で作成したクラスライブラリ(DLL)をMFCで利用する

[C#][VC][MFC]消えると困るのでコピペ MFC/C# – C#で作成したクラスライブラリをMFCで利用する 基本 COMを利用してMFCからC#のクラスを利用する C#側 [準備] 1.プロジェクトプロパティ>ビルド 「COM相互運用機能の登録」にチェックを入れる ※自分でregasmを…

C#で作成したクラスライブラリをMFCで利用する

[C#][MFC]これからやってみるのでメモ。うーん、COMとして利用するのか… なんか気持ち悪いけど仕方ないのかな MFC/C# - C#で作成したクラスライブラリをMFCで利用する ネタ元 http://d.hatena.ne.jp/nutzlos/20110623/1308829150 DLLには下記2種類があるら…

WinInet を使ってフォームの POST 要求をシミュレートする方法

MFC WinInet クラスを使用する場合 CString strHeaders = _T("Content-Type: application/x-www-form-urlencoded"); // URL-encoded form variables - // name = "John Doe", userid = "hithere", other = "P&Q" CString strFormData = _T("name=John+Doe&us…

CTimeで現在の日時

MFC

[MFC]CTime::GetCurrentTime()で取得する CTime cTime1; cTime1 = CTime::GetCurrentTime(); // 現在時刻 ネタ元 http://www.g-ishihara.com/mfc_tm_01.htm

ダイアログの画面更新とかにはUpdateWindow()

MFC

[MFC] ネタ元 http://okwave.jp/qa/q1724819.html