(見てる方へ)他の項目もさることながら、特にこちらについては自信が無いことを前もって報告しておきます。
VC++ ver.6 を使用中。
以下の分類は主観(各所で色々な話題が取り扱われている)
ある関数に必要なヘッダとライブラリはヘルプに記載されている。ヘッダは include すれば良い。ライブラリは
のいずれかで追加する(両者はどう違うのだ?)
WindowClassで定義。戻り値は多分重要でない。 デフォルトの挙動は DefWindowProc で実現されるので、望むメッセージ処理の後にこれを入れると良い。CALLBACK修飾子が宣言されねばならない。
FindWindow、WindowFromPointあたりを使う。FindWindowExで子ウィンドウも検索できる。プログラムのウィンドウハンドルの取得も参照。
以下VC++超初心者のホームページから。
IDを手動でdefineするのが一番楽そうだ。
ProgIDが知りたい時には、レジストリでHKEY_CLASSES_ROOT以下を見るとよい。
SDKに限った話ではないが、VCでグラフを実現するのはそう簡単なことではなさそうだ。自分で描画することはできるが面倒くさいのでパス。そこで既存のものを使いたくなるわけだが、標準でついてくるのはMSChartくらい。VBから使うのは簡単だが、VCから使うにはかなりのクセモノである上に文書も殆ど無い。定番がどれなのかもよくわからない。CodeGuruでも乱立してるみたいだ。
ダイアログボックスを使って得た入力値をプログラム中で使うにはどうすれば良いか?
グローバル変数を使うのが一つの解であるが、DialogBoxParamがベスト(多分)。まずやりとりしたいデータを構造体にしておいて、最後の引数にそこへのポインタを指定すると良い。
DDX_TEXTでCStringを使おうとしたが、「この変換を実行可能なユーザー定義変換演算子がないか、または演算子を呼び出せません」と言われて怒られた。原因は面倒なので調べてないが、atlmisc.h を atlddx.h よりあとにincludeしていたのが原因のようであった。
以下のメモはMFCの森での記述を抜粋したにすぎません。
MFCでプリコンパイル済みヘッダを利用している際には、全てのcppファイルについてstdafx.hをインクルードしておかなくてはいけない。
プロパティでグループにチェックしておかなければ、ClassWizardのメンバ変数の覧に登場してくれないようである。
「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で楽々記述できるのが大変らくちんなのだが、ユーザー定義メッセージを扱う際には手動でなくてはいけない。
調べようと思ってとりあえず以下の文書を見つけたが、詳しい検証はしていない。
VB6でいうところのDoEventsは以下(なのだそうだ。出典は失念)
MSG msg; if(::PeekMessage(&msg,NULL,0,0,PM_REMOVE)){ ::TranslateMessage(&msg); ::DispatchMessage(&msg); }
switch文を使っていたら上記のようなエラー(C2361)に遭遇した。あるcaseのみで使う変数をそこで宣言した場合に、残りのcaseでもスコープが残っているけどいいのか、というニュアンスなのだそうだ。こんな時は変数を宣言・使用している箇所をブロックの中に閉じ込めてしまえばよい。
・・・という内容を http://frog.raindrop.jp/knowledge/archives/000223.html にて学びました。
紙の向きのデフォルトを変えたいなと思っていたら以下の文書を見つけた。目的達成。
National InstrumentsのMeasurement Studioを使って、計測制御用のプログラムが使い慣れた言語でラクラク書けてとても幸せだが、成果物の配布にあたっては「インストーラを作りなさい」とのことであった。そういえばインストーラについては全く知らなかったのでWeb上の文書をひととおり調べた結果が以下。
#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; }
jpeg表示に便利だそうだ。
platformSDKが必要みたいだ。