Win32APIでのランキング作成
Posted: 2015年7月06日(月) 18:03
て並び替え→クリア後にタイムランキングの表示としたいと思ってます。
int Ranking_Load(void){
ifstream fin("ranking1.txt");
if (!fin){
return 1;
}
const int num = 8;
int ranking[num];
for (int i = 0; i < num; i++){ //ファイル読み込み
fin >> ranking[i];
}
int max = ranking[0];
for (int j = 0; j < num; j++){
if (max < ranking[j]) //最大値
max = ranking[j];
}
fin.close();
return max;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// 画像を読み込む準備
HDC hdc; // デバイスコンテキストハンドル
PAINTSTRUCT ps; // ペイント構造体
RECT rect;
// バックバッファ用コンテキストハンドルと、ビットマップハンドルの準備
static HDC hdc_back; // 裏画面(バックバッファ)用デバイスコンテキストハンドル
static HBITMAP hb_back; // 裏画面(バックバッファ)用ビットマップハンドル
HDC hdcMem;
switch (msg)
{
case WM_USER + 1: // ゲームループ(SendMessageから呼ばれる)
obj1.toPoint(&player);
Get_Key(); // キー入力関数へ
Player_move(); //移動関数へ
// 結果の再描画 WM_PAINTを実行する
InvalidateRect(hWnd, NULL, false);
return 0;
case WM_PAINT: // 画面を描画する時の処理
// 描画の開始
hdc = BeginPaint(hWnd, &ps);
RECT rt;
GetClientRect(hWnd, &rt);
// Paint関数へ
Paint(hdc_back);
//バックバッファに保存された画像を表画面に描画
BitBlt(hdc, 0, 0, 1000, 450, hdc_back, 0, 0, SRCCOPY);
DrawText(hdc,max, -1, &rect, DT_LEFT | DT_WORDBREAK);
// 描画の終了
EndPaint(hWnd, &ps);
return 0;
case WM_CREATE:
// ゲーム初期化関数へ ///////////////////
Init_Game();
// 描画の開始
hdc = GetDC(hWnd);
// 互換デバイスコンテキストの作成
hdc_back = CreateCompatibleDC(hdc);
// 互換ビットマップの作成
hb_back = CreateCompatibleBitmap(hdc, 1000, 450);
// オブジェクトの選択
SelectObject(hdc_back, hb_back);
// 描画の終了
ReleaseDC(hWnd, hdc);
// ビットマップハンドルに画像データを読み込み保存しておく
hb_char = (HBITMAP)LoadImage(NULL, TEXT("char.bmp"), IMAGE_BITMAP,
0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
return 0;
case WM_DESTROY: // 最後にウインドウが閉じられた時の処理
// デバイスコンテキストの解放
DeleteDC(hdc_back);
// オブジェクトの解放
DeleteObject(hb_back);
DeleteObject(hb_all);
PostQuitMessage(0);
return 0;
default: // デフォルト処理
return DefWindowProc(hWnd, msg, wParam, lParam);
}
}
そこの前でwsprintf関数またはwsprintfA関数などを用いてmaxを文字列に変換し、luc さんが書きました:error C2664: 'int DrawTextW(HDC,LPCWSTR,int,LPRECT,UINT)' : 引数 2 を 'int' から 'LPCWSTR' へ変換できません。
とでて動きません。どうすればいいでしょうか。
///////ウインドウプロシージャ関数//////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// 画像を読み込む準備
HDC hdc; // デバイスコンテキストハンドル
PAINTSTRUCT ps; // ペイント構造体
RECT rect;
// バックバッファ用コンテキストハンドルと、ビットマップハンドルの準備
static HDC hdc_back; // 裏画面(バックバッファ)用デバイスコンテキストハンドル
static HBITMAP hb_back; // 裏画面(バックバッファ)用ビットマップハンドル
HDC hdcMem;
TCHAR max_max[10];
switch (msg)
{
case WM_USER + 1: // ゲームループ(SendMessageから呼ばれる)
obj1.toPoint(&player);
Get_Key(); // キー入力関数へ
Player_move(); //移動関数へ
// 結果の再描画 WM_PAINTを実行する
InvalidateRect(hWnd, NULL, false);
return 0;
case WM_PAINT: // 画面を描画する時の処理
// 描画の開始
hdc = BeginPaint(hWnd, &ps);
RECT rt;
GetClientRect(hWnd, &rt);
// Paint関数へ
Paint(hdc_back);
//バックバッファに保存された画像を表画面に描画
BitBlt(hdc, 0, 0, 1000, 450, hdc_back, 0, 0, SRCCOPY);
wsprintf(max_max, TEXT("%d"), max);
DrawText(hdc,max_max, -1, &rect, DT_LEFT | DT_WORDBREAK);
// 描画の終了
EndPaint(hWnd, &ps);
return 0;
case WM_CREATE:
// ゲーム初期化関数へ ///////////////////
Init_Game();
// 描画の開始
hdc = GetDC(hWnd);
// 互換デバイスコンテキストの作成
hdc_back = CreateCompatibleDC(hdc);
// 互換ビットマップの作成
hb_back = CreateCompatibleBitmap(hdc, 1000, 450);
// オブジェクトの選択
SelectObject(hdc_back, hb_back);
// 描画の終了
ReleaseDC(hWnd, hdc);
// ビットマップハンドルに画像データを読み込み保存しておく
hb_char = (HBITMAP)LoadImage(NULL, TEXT("char.bmp"), IMAGE_BITMAP,
0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
return 0;
case WM_DESTROY: // 最後にウインドウが閉じられた時の処理
// デバイスコンテキストの解放
DeleteDC(hdc_back);
// オブジェクトの解放
DeleteObject(hb_back);
DeleteObject(hb_all);
PostQuitMessage(0);
return 0;
default: // デフォルト処理
return DefWindowProc(hWnd, msg, wParam, lParam);
}
}
今回のプロジェクトでコンパイルするソースコード(ヘッダではない)のグローバルスコープ(関数や構造体などの宣言の外)の場所のどこかにint max;と書き、実体を作ってください。luc さんが書きました:error LNK2001: 外部シンボル ""int max" (?max@@3HA)" は未解決です。
float Ranking_Load(void){ //ランキングを読み込む
int i, j,tmp;
ifstream fin("ranking1.txt");
if (!fin){
return 1;
}
float ranking[8];
for (i = 0; i < 8; i++){ //ファイル読み込み
fin >> ranking[i];
}
for (i = 0; i < 8; i++){
for (j = i + 1; j< 8; j++){
if (ranking[i] < ranking[j]){ //並び替え
tmp = ranking[i];
ranking[i] = ranking[j];
ranking[j] = tmp;
}
}
}
fin.close(); //ファイルを閉じる
return ranking[8];
}
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
// 画像を読み込む準備
HDC hdc; // デバイスコンテキストハンドル
PAINTSTRUCT ps; // ペイント構造体
RECT rect;
// バックバッファ用コンテキストハンドルと、ビットマップハンドルの準備
static HDC hdc_back; // 裏画面(バックバッファ)用デバイスコンテキストハンドル
static HBITMAP hb_back; // 裏画面(バックバッファ)用ビットマップハンドル
HDC hdcMem;
TCHAR max_max[8];
switch (msg)
{
case WM_USER + 1: // ゲームループ(SendMessageから呼ばれる)
obj1.toPoint(&player);
Get_Key(); // キー入力関数へ
Player_move(); //移動関数へ
// 結果の再描画 WM_PAINTを実行する
InvalidateRect(hWnd, NULL, false);
return 0;
case WM_PAINT: // 画面を描画する時の処理
// 描画の開始
hdc = BeginPaint(hWnd, &ps);
RECT rt;
GetClientRect(hWnd, &rt);
// Paint関数へ
Paint(hdc_back);
//バックバッファに保存された画像を表画面に描画
BitBlt(hdc, 0, 0, 1000, 450, hdc_back, 0, 0, SRCCOPY);
wsprintf(max_max, TEXT("%d"), ranking[0]);
//wsprintf(max_max, TEXT("%d"), max); //INT型からTCHARに変換
TextOut(hdc, 10, 90, max_max, lstrlen(max_max)); //文字描画
//TextOut(hdc, 10, 90, max_max,lstrlen(max_max));
// 描画の終了
EndPaint(hWnd, &ps);
return 0;
case WM_CREATE:
// ゲーム初期化関数へ ///////////////////
Init_Game();
// 描画の開始
hdc = GetDC(hWnd);
// 互換デバイスコンテキストの作成
hdc_back = CreateCompatibleDC(hdc);
// 互換ビットマップの作成
hb_back = CreateCompatibleBitmap(hdc, 1000, 450);
// オブジェクトの選択
SelectObject(hdc_back, hb_back);
// 描画の終了
ReleaseDC(hWnd, hdc);
// ビットマップハンドルに画像データを読み込み保存しておく
hb_char = (HBITMAP)LoadImage(NULL, TEXT("char.bmp"), IMAGE_BITMAP,
0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
return 0;
case WM_DESTROY: // 最後にウインドウが閉じられた時の処理
// デバイスコンテキストの解放
DeleteDC(hdc_back);
// オブジェクトの解放
DeleteObject(hb_back);
DeleteObject(hb_all);
PostQuitMessage(0);
return 0;
default: // デフォルト処理
return DefWindowProc(hWnd, msg, wParam, lParam);
}
多分、描画に使用しているranking[0]に値を入れる処理が無いから値が入らないのでしょう。luc さんが書きました:描画すると0と表示されて値が入ってないみたいです。原因教えてください!