■SDKのテンプレートとして作成しました。
リソースなしでコードからボタンやウインドウを生成しています。
ボタンを押したり、終了しようとするとメッセージボックスによりメッセージが表示されます。
#include <windows.h>
#define ID_BUTTON_1 1011
#define ID_BUTTON_2 1012
#define ID_BUTTON_3 1013
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE,int);
char szClassName[]="sample01"; //ウインドウクラス
HINSTANCE hInst;
HWND hWnd;
int WINAPI WinMain(HINSTANCE hCurInst,HINSTANCE hPrevInst,
LPSTR lpsCmdLine,int nCmdShow ){
MSG msg;
BOOL bRet;
hInst = hCurInst;
if(!InitApp(hCurInst)) return FALSE;
if(!InitInstance(hCurInst,nCmdShow)) return FALSE;
while((bRet = GetMessage(&msg,NULL,0,0)) != 0){
if(bRet == -1){
MessageBox(NULL,"GetMessage ERR","Error",MB_OK);
break;
}else{
if(!IsDialogMessage(hWnd,&msg)){//タブキーでコントロールを移動したくない場合はこの行をコメントする
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
return (int)msg.wParam;
}
//ウインドウクラスの登録
ATOM InitApp(HINSTANCE hInst){
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style =CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;//プロ―ジャー名
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;//インスタンス
wc.hIcon = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hCursor = (HCURSOR)LoadImage(NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL; //メニュー名
wc.lpszClassName = (LPCSTR)szClassName;
wc.hIconSm = (HICON)LoadImage(NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
return (RegisterClassEx(&wc));
}
//ウインドウの生成
BOOL InitInstance(HINSTANCE hInst,int nCmdShow){
hWnd = CreateWindow(szClassName,
"タイトルバーにこの名前が表示されます",
WS_OVERLAPPEDWINDOW,//ウインドウの種類
CW_USEDEFAULT, //x座標
CW_USEDEFAULT, //y座標
CW_USEDEFAULT, //幅
CW_USEDEFAULT, //高さ
NULL, //親ウインドウのハンドル、親を作るときは NULL
NULL, //メニューハンドル、クラスメニューを
//使うときは NULL
hInst, //インスタンスハンドル
NULL);
if(!hWnd) return FALSE;
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//描画メソッド
//-------------------------------
//再描画したい時は次のように書く
//InvalidateRect(hWnd, NULL,1);
//UpdateWindow(hWnd);
//-------------------------------
COLORREF bkColor=RGB(200,255,255);//背景色を規定する
HBRUSH bkColorBrush=CreateSolidBrush(bkColor);//背景色のブラシを用意する
void paint(HWND hWnd){
RECT rc;
GetClientRect(hWnd,&rc);//ウインドウの範囲を取得
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd,&ps);
//背景色の変更
SetBkColor(hdc,bkColor);
FillRect(hdc,&rc,bkColorBrush);
SetTextColor(hdc,RGB(255,0,0));//テキストの色
//フォントの作成 ↓フォントのサイズ
HFONT font = CreateFont(100,0,0,0,FW_DONTCARE,FALSE,FALSE,FALSE,SHIFTJIS_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH | FF_DONTCARE,"MS ゴジック");
HFONT oldFont = (HFONT)SelectObject(hdc,font);//フォントの適用
HPEN pen=CreatePen(PS_SOLID,3,RGB(255,0,0));//ペンの作成 PS_SOLID(実線) PS_DASH(破線) PS_DOT(点線) PS_DASHDOT(1点鎖線)
//PS_DASHDOTDOT(2点鎖線) PS_NULL(空のペン) PS_INSIDEFRAME(実線)
HPEN oldPen = (HPEN)SelectObject(hdc,pen);//ペンの適用
HBRUSH brush = CreateSolidBrush(RGB(0,0,255));//ブラシの作成 CreateHatchBrush ハッチ模様のブラシ
HBRUSH oldBrush = (HBRUSH)SelectObject(hdc,brush);//ブラシの適用
char* str="abcd\ntest";
//TextOut(hdc,10,10,(LPCTSTR)str,(int)strlen(str));//字を書き込みます(マイナス座標の設定も可能)
DrawText(hdc,(LPCTSTR)str,(int)strlen(str),&rc,DT_CENTER | DT_WORDBREAK);//字を書き込みます\nなどにも対応
//SetPixel(hdc,10,10,RGB(255,0,0));//指定座標に点を打ちます
//MoveToEx(hdc,10,10,NULL);LineTo(hdc,100,100);//線を引きます
//Rectangle(hdc,10,10,100,100);//四角に塗りつぶし
SelectObject(hdc,oldBrush);//ブラシを元に戻す
SelectObject(hdc,oldPen);//ペンを元にもどす
SelectObject(hdc,oldFont);//フォントを元に戻す
DeleteObject(brush);//ブラシの破棄
DeleteObject(pen);//ペンの破棄
DeleteObject(font);//フォントの破棄
EndPaint(hWnd,&ps);
}
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp){
switch(msg){
case WM_CREATE:
//ボタンの生成
CreateWindow("BUTTON", "ボタン1",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,5,5,100,50, hWnd, (HMENU)ID_BUTTON_1, hInst ,NULL);
CreateWindow("BUTTON", "ボタン2",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,5,55,100,50, hWnd, (HMENU)ID_BUTTON_2, hInst ,NULL);
CreateWindow("BUTTON", "ボタン3",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_TABSTOP,5,105,100,50, hWnd, (HMENU)ID_BUTTON_3, hInst ,NULL);
SetTimer(hWnd,1000,500,NULL);//ID:1000 500msのタイマーを作成
break;
case WM_PAINT:
paint(hWnd);
break;
case WM_TIMER:
if(wp == 1000){
OutputDebugString("a");//デバッグ出力
}
else return (DefWindowProc(hWnd,msg,wp,lp));//自分と関係のないタイマーは戻す
break;
case WM_COMMAND:
switch (LOWORD(wp)){
case ID_BUTTON_1:
MessageBox(hWnd,"BUTTON1が押されました","",0);
break;
case ID_BUTTON_2:
MessageBox(hWnd,"BUTTON2が押されました","",0);
break;
case ID_BUTTON_3:
MessageBox(hWnd,"BUTTON3が押されました","",0);
break;
}
break;
case WM_CLOSE:
if(IDYES==MessageBox(hWnd,"終了してもよろしいですか?","終了確認", MB_YESNO | MB_ICONQUESTION)){
KillTimer(hWnd,1000);//タイマーを破棄
DestroyWindow(hWnd);//ウインドウを破棄
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd,msg,wp,lp));
}
return 0;
}
■上記プログラムを改造するときに使う方法など
▼タイトルバーのテキストの変更方法
SetWindowText(hWnd,"testtest");//タイトルバーのテキストを変更
▼メニューの追加方法
@リソースの追加(リソーススクリプトの追加)
リソースファイルを追加して、リソースを追加でMenuを選択
プロパティにて ID : "TESTMENU" に変更
メニュ項目を追加 この時 メニュ項目(&A) ←ショートカットキーが登録できます。
Aメニューを作成した必要なヘッダを準備
#include "resource.h" 追加して作成したリソースを読み込む
ATOM InitApp(HINSTANCE hInst)を編集してメニュー名を追加します
wc.lpszMenuName = "TESTMENU";//MAKEINTRESOURCE(IDR_MENU1); //メニュー名を追加
Bプロシージャーに追加することで動作するようになります
case WM_COMMAND:
switch(LOWORD(wp)){
case ID_****:
MessageBox(hWnd,"****","debug",MB_OK);
break;
case ID_*****:
MessageBox(hWnd,"*****","debug",MB_OK);
break;
default:
return (DefWindowProc(hWnd,msg,wp,lp));
}
▼ダイアログの追加方法
@リソースの追加(リソーススクリプトの追加)
リソースファイルを追加して、リソースを追加でDialogを選択
プロパティにて ID : "TESTDLG" に変更
Buttonを2個 EditControlを1個貼り付ける
Aダイアログを作成した必要なヘッダを準備
#include "resource.h" を追加
Bダイアログプロシージャーをコードに追加
BOOL CALLBACK TestDlgProc(HWND hDlg,UINT msg,WPARAM wp,LPARAM lp){
switch (msg){
case WM_COMMAND:
switch (LOWORD(wp)){
case IDC_BUTTON1:
OutputDebugString("button1");//デバッグ出力
SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),"button1");//ダイアログに貼り付けたテキストに文字を入れる
return TRUE;
case IDC_BUTTON2:
OutputDebugString("button2");//デバッグ出力
SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),"button2");//ダイアログに貼り付けたテキストに文字を入れる
return TRUE;
}
return FALSE;
case WM_CLOSE:
EndDialog(hDlg,WM_CLOSE);//モーダル
//DestroyWindow(hDlg);//モードレス
return TRUE;
}
return FALSE;
}
Cダイアログの表示 必要なタイミングで呼び出します
▽モーダル
DialogBox(hInst,MAKEINTRESOURCE(TESTDLG),hWnd,(DLGPROC)TestDlgProc);
▽モードレス
・方法その1 モーダルと同じ呼び方で第3引数にNULLを入れるとモードレスになります。
DialogBox(hInst,MAKEINTRESOURCE(TESTDLG),NULL ,(DLGPROC)TestDlgProc);
・方法その2
HWND hDlg;
hDlg=CreateDialog(hInst,MAKEINTRESOURCE(TESTDLG),hWnd,(DLGPROC)TestDlgProc);
ShowWindow(hDlg,SW_NORMAL);
・TABSTOPを動作するようにする
モードレスの場合はメッセージがダイアログまで来ないため、メイン関数のループの中を以下のように変更する必要があります
if(!( IsDialogMessage(hWnd,&msg)||IsDialogMessage(hDlg,&msg) ) ){//タブキーでコントロールを移動したくない場合はこの行をコメントする
TranslateMessage(&msg);
DispatchMessage(&msg);
}
しかし、このままコンパイルすると hDlg が無いとエラーがでますので、HWND hDlg; の変数を関数の外で宣言して(0で初期化されるので好都合)、ダイアログを作成した時に保存するのが良いと思います。
▼時間の取得方法
SYSTEMTIME st;
GetLocalTime(&st);
char str[10];
wsprintf(str,"%d\n",st.wSecond);
OutputDebugString(str);//デバッグ出力
▲トップページ
>
Windows と C++