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

VC++ ver.6 を使用中。

link *

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

全般 *

SDK *

WTL *

COM *

MFC *

ド素人的メモ *

miscellaneous *

ライブラリ *

ある関数に必要なヘッダとライブラリはヘルプに記載されている。ヘッダは include すれば良い。ライブラリは

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

デバッグ *

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

ウィンドウプロシージャ *

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

同種のコントロールたちを、例えばVBのコントロール配列の様にして一括して処理したい *

以下VC++超初心者のホームページから。

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

ActiveX *

グラフ *

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

ダイアログボックス *

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

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

コモンコントロール *

WTL *

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

MFC *

プリコンパイル済みヘッダ *

以下のメモはMFCの森での記述を抜粋したにすぎません。

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

ラジオボタン *

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

ダイアログベースでEnter *

「MFCでEnterキーが反応してしまう」のやりとりを参考にしました。

ダイアログのデフォルト動作では、Enterによって終了してしまう。これを変えるには例えば以下のようにする。

BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg)
{
    if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
        return TRUE;
    return CDialog::PreTranslateMessage(pMsg);
}

ユーザー定義メッセージ *

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

エディットボックスの表示更新のタイミングについて *

調べようと思ってとりあえず以下の文書を見つけたが、詳しい検証はしていない。

DoEvents *

VB6でいうところのDoEventsは以下(なのだそうだ。出典は失念)

MSG msg;
if(::PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
}

ワーカスレッドとUpdateData *

AfxBeginThread でワーカスレッド作って、そこでもとのウィンドウのUpdateData呼出すとDebug Assertion Failedとなる件について、■ VisualC++(MFC限定)相談室 MFC7.dll■の174,176,177さんがやりとりされていた。

's'の初期化が'default'ラベルによって行われませんでした *

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

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

SDK雛型 *

シングルウィンドウ *

#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;
}

ダイアログベース *

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

#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;
}

GDI+ *

jpeg表示に便利だそうだ。

platformSDKが必要みたいだ。