(見てる方へ)他の項目もさることながら、特にこちらについては自信が無いことを前もって報告しておきます。


VC++ ver.6 を使用中。

*link [#d384f9c2]
以下の分類は主観(各所で色々な話題が取り扱われている)

**全般 [#w9428478]
-[[VC++超初心者のホームページ:http://www.mtakahashi.com/]]

**SDK [#f3775bb0]
-[[WisdomSoft:http://wisdom.sakura.ne.jp/]] WinAPIはもとより、各言語が広範に渡り解説されている。
-[[Win32 プログラミング入門:http://www7.plala.or.jp/keny01/windows/win32/]]
-[[猫でもわかるプログラミング(biglobe):http://www2m.biglobe.ne.jp/~yasutaka/]] 定番。MFCもあり
-[[VC++ programming tips:http://win32lab.com/tips/]]

**WTL [#qcb4e7a5]
-[[Roy.'s Homepage:http://homepage1.nifty.com/Roy_/index.htm]]より[[WTL研究所:http://homepage1.nifty.com/Roy_/Software/WTL/WTL.htm]]
-[[The So-Software Studio:http://home.att.ne.jp/banana/akatsuki/]]より[[ATL/WTLによるWindowsプログラミング:http://home.att.ne.jp/banana/akatsuki/doc/atlwtl/index.html]]
-[[Virtual Truth Lab.:http://lamoo.s53.xrea.com/]]より[[Develop:http://lamoo.s53.xrea.com/develop/index.html]]の項。GDI+の話題なども。
-[[かっとしの記録場所:http://www.mars.dti.ne.jp/~kattoshi/]]より[[Windows Template Library:http://www.mars.dti.ne.jp/~kattoshi/Program/]]
-[[The Code Project:http://www.codeproject.com/]]から[[WTL:http://www.codeproject.com/wtl/]]

**COM [#a661c794]
-[[やじやじ's Page:http://www.asahi-net.or.jp/~kv8s-yjm/]]より[[温COM知新:http://www.asahi-net.or.jp/~kv8s-yjm/another/yjamain.htm]]
-[[COM総合研究所:http://www5.plala.or.jp/atata/]]
-[[COM プログラミングの基本 (上):http://www.microsoft.com/japan/msdn/thisWeek/combasics/combasics1.asp]]

**MFC [#vc013cb7]
-[[Masayuki Tanaka's Home Page:http://www-kobayashi.ctrl.titech.ac.jp/~mtanaka/]]より[[Visual C++講座:http://www-kobayashi.ctrl.titech.ac.jp/~mtanaka/vc/]]
-[[VisualC++でソフトを作ろう:http://www.geocities.jp/chiakifujimon/]]

*ド素人的メモ [#rce851a6]

**miscellaneous [#n29a0cc8]
-新規作成 >> Win32 Application として開始。プロジェクト >> プロジェクトへ追加 >> 新規作成 としてファイルを追加。
-デバッグ・リリースビルドは、ビルド >> アクティブな構成の設定 から選択。
-アイコンはウィンドウクラス登録時に wc.hIcon = LoadIcon (NULL, MAKEINTRESOURCE(IDI_MYICON)); として指定。
-選択範囲にインデントを適用したい場合、編集 >> 高度な操作 >> 選択範囲の書式自動設定
-外部プロセス起動はWinExec
-Windowsは、各プロセスに固有のインスタンスハンドルを割当てる


**ライブラリ [#j6aef7a0]
ある関数に必要なヘッダとライブラリはヘルプに記載されている。ヘッダは include すれば良い。ライブラリは
-プロジェクト >> プロジェクトへ追加 >> ファイル
-プロジェクト >> 設定 >> リンク >> オブジェクト/ライブラリ モジュール

のいずれかで追加する(両者はどう違うのだ?)

**デバッグ [#pe230bf4]
:ステップオーバー | main routineのみのtrace。そこでcallされた関数内部に行かない
:ステップイン | main routineでcallされた関数内部に行く。外部ライブラリのコードの海に突き進むことも。
:ステップアウト | 現在のroutineを抜けて呼出し元に戻る

**ウィンドウプロシージャ [#ada54a0a]
WindowClassで定義。戻り値は多分重要でない。
デフォルトの挙動は DefWindowProc で実現されるので、望むメッセージ処理の後にこれを入れると良い。CALLBACK修飾子が宣言されねばならない。

**同種のコントロールたちを、例えばVBのコントロール配列の様にして一括して処理したい [#zb7b0798]
-[[同種複数のメッセージをひとつのハンドラで処理する-2. コントロール編 + DDX 変数の配列:http://www.interq.or.jp/jazz/iijima/mfc/iijima/05range2.html]]

以下[[VC++超初心者のホームページ:http://www.mtakahashi.com/]]から。

-[[A7592 コントロール配列と同じことは?:http://www.mtakahashi.com/old/a7600.html#A7592]]
-[[A7371 ボタンを配列化したい:http://www.mtakahashi.com/old/a7375.html#A7371]]
-[[A3610 VBのコントロール配列の様な使い方:http://www.mtakahashi.com/old/a3625.html#A3610]]
-[[A3283 VBでいうコントロール配列をVCでするには:http://www.mtakahashi.com/old/a3300.html#A3283]]

IDを手動でdefineするのが一番楽そうだ。

**ActiveX [#m2aced32]
-[[SDKでActiveX MFCを利用する:http://www.heppoko.gr.jp/~shimatta/blog/programs/archives/000016.html]]


**グラフ [#xc5a4a94]
SDKに限った話ではないが、VCでグラフを実現するのはそう簡単なことではなさそうだ。自分で描画することはできるが面倒くさいのでパス。そこで既存のものを使いたくなるわけだが、標準でついてくるのはMSChartくらい。VBから使うのは簡単だが、VCから使うにはかなりのクセモノである上に文書も殆ど無い。定番がどれなのかもよくわからない。[[CodeGuru:http://www.codeguru.com/]]でも乱立してるみたいだ。
-[[CodeGuru より Other Controls:http://www.codeguru.com/Cpp/controls/controls/]]

**ダイアログボックス [#r5fa1ba8]
ダイアログボックスを使って得た入力値をプログラム中で使うにはどうすれば良いか?

グローバル変数を使うのが一つの解であるが、DialogBoxParamがベスト(多分)。まずやりとりしたいデータを構造体にしておいて、最後の引数にそこへのポインタを指定すると良い。

**コモンコントロール [#wfdd61e5]
-[[猫でもわかるプログラミング(biglobe):http://www2m.biglobe.ne.jp/~yasutaka/]]より[[第111章 ツリービューの基礎:http://www2m.biglobe.ne.jp/~yasutaka/sdk2/sdk_111.htm]]

**WTL [#f59206bf]
DDX_TEXTでCStringを使おうとしたが、「この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません」と言われて怒られた。原因は面倒なので調べてないが、atlmisc.h を atlddx.h よりあとにincludeしていたのが原因のようであった。

**MFC [#v5542635]

***プリコンパイル済みヘッダ [#paa8c494]
以下のメモは[[MFCの森:http://www.page.sannet.ne.jp/t1533/program/tips.html]]での記述を抜粋したにすぎません。

MFCでプリコンパイル済みヘッダを利用している際には、全てのcppファイルについてstdafx.hをインクルードしておかなくてはいけない。

***ラジオボタン [#ga106c18]
プロパティでグループにチェックしておかなければ、ClassWizardのメンバ変数の覧に登場してくれないようである。

***ダイアログベースでEnter [#v834b7db]
[[「MFCでEnterキーが反応してしまう」:http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200408/04080061.txt]]のやりとりを参考にしました。

ダイアログのデフォルト動作では、Enterによって終了してしまう。これを変えるには例えば以下のようにする。
 BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg)
 {
     if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
         return TRUE;
     return CDialog::PreTranslateMessage(pMsg);
 }


***ユーザー定義メッセージ [#fb6d6cb2]
MFCではメッセージマップをClassWizardで楽々記述できるのが大変らくちんなのだが、ユーザー定義メッセージを扱う際には手動でなくてはいけない。

-[[ユーザーメッセージ:http://homepage2.nifty.com/DSS/VCPP/API/UserMessage.htm]]


***エディットボックスの表示更新のタイミングについて [#rfe25aa8]
調べようと思ってとりあえず以下の文書を見つけたが、詳しい検証はしていない。

-[[http://search.acty-net.ne.jp/mfc_search/archive/2004-2/msg00085.html]]

***DoEvents [#qe3a68ea]
VB6でいうところのDoEventsは以下(なのだそうだ。出典は失念)
 MSG msg;
 if(::PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
     ::TranslateMessage(&msg);
     ::DispatchMessage(&msg);
 }


***ワーカスレッドとUpdateData [#xac43f4b]
AfxBeginThread でワーカスレッド作って、そこでもとのウィンドウのUpdateData呼出すとDebug Assertion Failedとなる件について、[[■ VisualC++(MFC限定)相談室 MFC7.dll■:http://pc2.2ch.net/tech/kako/1047/10479/1047949606.html]]の174,176,177さんがやりとりされていた。

***'s'の初期化が'default'ラベルによって行われませんでした [#u05b3f1d]
switch文を使っていたら上記のようなエラー(C2361)に遭遇した。あるcaseのみで使う変数をそこで宣言した場合に、残りのcaseでもスコープが残っているけどいいのか、というニュアンスなのだそうだ。こんな時は変数を宣言・使用している箇所をブロックの中に閉じ込めてしまえばよい。

・・・という内容を http://frog.raindrop.jp/knowledge/archives/000223.html にて学びました。

*SDK雛型 [#k6883f62]
**シングルウィンドウ [#c29cbab0]
-[[WisdomSoft:http://wisdom.sakura.ne.jp/]]より[[終了処理:http://wisdom.sakura.ne.jp/system/winapi/win32/win11.html]]がベース。

 #include<windows.h>
 const char lpClassName[]="SDKTemplate";    // window class
 
 LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
     switch (msg) {
         case WM_COMMAND:
         switch(LOWORD(wp)) {
             //case BUTTON:
             //break;
             }
         break;
         case WM_DESTROY:
             PostQuitMessage(0);
             return 0;
         }
         return DefWindowProc(hwnd , msg , wp , lp);
 }
 
 int WINAPI WinMain(HINSTANCE hInst , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) {
     HWND hwnd;
     MSG msg;
     WNDCLASS winc;
 
     winc.style	= CS_HREDRAW | CS_VREDRAW;
     winc.lpfnWndProc = WndProc;
     winc.cbClsExtra = 0;
     winc.cbWndExtra = 0;
     winc.hInstance = hInst;
     winc.hIcon	= LoadIcon(NULL , IDI_APPLICATION);
     winc.hCursor = LoadCursor(NULL , IDC_ARROW);
     winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
     winc.lpszMenuName = NULL;
     winc.lpszClassName = lpClassName;
 
     if (!RegisterClass(&winc)) return 0;
 
     hwnd = CreateWindow(
         lpClassName ,    // class name
         TEXT("My SDK") , // window name
         WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
         100 , 100 , // horizontal, vertical position
         200 , 200 , // width and height
         NULL ,	// parent window
         NULL ,	// menu
         hInst , // application instance
         NULL // window-creation data
     );
 
     if (hwnd == NULL) return 0;
 
     while (GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
     return msg.wParam;
 }

**ダイアログベース [#z1ef9dde]

-[[初歩のVC++Programming Tips Win32SDK篇--ダイアログベースアプリケーションの作り方:http://win32lab.com/tips/tips11.html]]
-[[ダイアログウィンドウ:http://wisdom.sakura.ne.jp/system/winapi/win32/win89.html]]([[WisdomSoft:http://wisdom.sakura.ne.jp/]])
-[[skamachi's factory:http://skamachi.gotdns.com/index.html]]より[[ダイアログベース アプリケーション:http://skamachi.gotdns.com/sdk0.html]]
-[[u1271055のページ:http://home.hiroshima-u.ac.jp/u1271055/]]の[[SDK Programming Samples:http://home.hiroshima-u.ac.jp/u1271055/sdk/]]

以上を参考に作成しましたが、理解不足に基づくミスを私が犯してる可能性は大いにあります。

 #include<windows.h>
 #include"resource.h"
 
 BOOL CALLBACK DialogProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
 {
   switch(msg){
   case WM_INITDIALOG:
     // initialize
     return TRUE;
   case WM_COMMAND:
     switch(LOWORD(wp)){
     case IDOK:
       EndDialog(hDlg,LOWORD(wp));
       return TRUE;
     case IDCANCEL:
       EndDialog(hDlg,LOWORD(wp));
       return TRUE;
     }
     break;
   case WM_CLOSE:
     PostQuitMessage(0);
     break;
   }
   return FALSE;
 }
 
 
 int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hPreInst, LPSTR pCmdLine,int nCmdShow)
 {
   DialogBox(hinst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,DialogProc);
   return FALSE;
 }


// コンパイルの前にIDD_DIALOG1なるダイアログのリソースを作成しておく必要がある。その時、
// ダイアログのクラス名(リソースのプロパティでMFCのチェックを外すと編集可)はソース内で指定したウィンドウクラス名と同一にする。
// 
// #include<windows.h>
// #include"resource.h"
// const char szClassName[]="dialogbase_template";    // window class
// 
// 
// LRESULT CALLBACK mainDlgProc(HWND hWnd,UINT uMessage,WPARAM wParam,LPARAM lParam)
// {
// 
//     switch(uMessage){
//     case WM_INITDIALOG:
//         break;
//     case WM_COMMAND:
//         switch(LOWORD(wParam)){
//         case IDCANCEL:
//             DestroyWindow(hWnd);
//             break;
//         default:
//             return DefWindowProc(hWnd,uMessage,wParam,lParam);
//         }
//         break;
//     case WM_CLOSE:
//         PostMessage(hWnd,WM_COMMAND,IDCANCEL,0);
//         break;
//     case WM_DESTROY:
//         PostQuitMessage(0);
//         break;
//     default:
//         return DefWindowProc(hWnd,uMessage,wParam,lParam);
//     }
//     
//     return 0;
// }
// 
// 
// 
// int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hinstPrevious, LPSTR lpszCmdLine, int nCmdShow)
// {
//     HWND hDlg;
//     MSG msg;
//     WNDCLASS winc;
//     
//     winc.style         = 0;
//     winc.lpfnWndProc   = mainDlgProc;
//     winc.cbClsExtra    = 0;
//     winc.cbWndExtra    = DLGWINDOWEXTRA;
//     winc.hInstance     = hInst;
//     winc.hIcon         = LoadIcon(NULL,IDI_APPLICATION);
//     winc.hCursor       = LoadCursor(NULL,IDC_ARROW);
//     winc.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
//     winc.lpszMenuName  = NULL;
//     winc.lpszClassName = szClassName; 
// 
//     if(!RegisterClass(&winc)) return FALSE;
// 
//     hDlg = CreateDialog(hInst,MAKEINTRESOURCE(IDD_DIALOG1),0,mainDlgProc);
//     if(!hDlg) return FALSE;
// 
//     ShowWindow(hDlg, nCmdShow);
//     UpdateWindow(hDlg);
// 
// 
//     while(GetMessage(&msg, NULL, 0, 0))
//     {
//         if(IsDialogMessage(hDlg,&msg) == FALSE)
//         {
//             TranslateMessage(&msg);
//             DispatchMessage(&msg);
//         }
//     }
// 
//     return msg.wParam;
// }




*GDI+ [#eacc95d6]

jpeg表示に便利だそうだ。
-[[GDI+に関するメモ:http://www.nilab.info/megabbs/readres.cgi?bo=computer&vi=1093051600]]
-[[GDI+の導入:http://lamoo.s53.xrea.com/develop/gdiplus/gdiplus.html]]
-[[第335章 GDI+の基礎 その1(猫でもわかるプログラミングより):http://www.kumei.ne.jp/c_lang/sdk4/sdk_335.htm]]
-[[第336章 GDI+の基礎 その2(猫でもわかるプログラミングより):http://www.kumei.ne.jp/c_lang/sdk4/sdk_336.htm]]

platformSDKが必要みたいだ。
-[[Windows Server 2003 PSDK Full Download with Local Install(Windows 2000でもこちらから導入するらしい):http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm]]
-[[Visual C++ Toolkit + Platform SDK のインストールとテスト:http://homepage1.nifty.com/kazubon/progdoc/poor/vctoolkit.html]]