結果は正常に動作したが、前にへにっくすさんに指摘された”LPSTR/LPCSTRが混じってる”が解決していない。
う~ん・・・どうしようか・・・・ 未だにこの2つの内部的な詳細が理解しきれていないのが辛い。
でもそれ以前に改行一つに2日以上掛けてる時点で俺のプログラムスキルって・・・
#include
//プロトタイプ宣言
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
//ウィンドウクラス
TCHAR szClassName[] = TEXT("sample01");
//windowsプログラムのエントリーポイント
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow)
{
MSG msg;
BOOL bRet;
if(!InitApp(hCurInst))return false;
if(!InitInstance(hCurInst, nCmdShow))return false;
//メッセージ取得
while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0){
if(bRet == -1){
break;
}else{
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 = 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 hWnd;
hWnd = CreateWindow(szClassName, //クラス名
TEXT("猫4版_P13_空ウィンドウ雛形"), //ウィンドウ名
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;
}
//ウィンドウプロシージャ(callback関数)・・・・・最重要!!!!!!!
//windowsプログラムはただ処理順にソースを書くのではなく、
//受け取ったメッセージごとに合わせた処理を書く。
//(下のswitch文[WM_XXXXX]の部分が受け取ったメッセージに該当)
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
//表示する文字列の宣言
PAINTSTRUCT ps;
HDC hdc;
RECT rc;
GetClientRect(hWnd,&rc); //クライアント領域の矩形を取得
//LPCSTR lpszStr = TEXT("猫でもわかる\nWindowsプログラミング。"); //TEXTマクロについてはP419
//デバッグ用に使いたいときはwsprintfを使う。猫4P123
//実験(wsprintfの使用)-------------------------------------------------------------
TCHAR StrOutPut[1024]; //文字列と書式設定格納するアレ
wsprintf(StrOutPut,TEXT("How are you, GI Joe? \n It seems to me that most of you are poorly informed about the going of the war, \n to say nothing about a correct explanation of your presence over here. \n Nothing is more confused than to be ordered into a war to die or to be maimed for life without the faintest idea of what's going on.\n %d"),1975430);
//end------------------------------------------------------------------------------
switch(msg){
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps); //デバイスコンテキストを取得
//TextOutは\系マクロが使用できない。
//\nとか使いたかったらDrawTextを使用。(もしくはwsprintf)
//TextOut(hdc, 10, 10, lpszStr, lstrlen(lpszStr)); //文字列を描画
//wsprintfを用いての文字列出力-------------------------------------------------
//TextOut(hdc, 50, 50, StrOutPut, lstrlen(StrOutPut));
//DrawTextの引数に関しては猫4p49
DrawText(hdc,StrOutPut, -1, &rc, DT_CENTER | DT_WORDBREAK); //DrawTextなら\nによる改行も可能
//-----------------------------------------------------------------------------
EndPaint(hWnd, &ps); //描画を終了
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}