Отображение растровой картинки, Морской бой на С++ , Win32 проект
пишу морской бой, проблема с графическим выводом предварительно сохраненного bmp-ка, способ вывода картинки скопировал с инета, разобрался с ним только примерно. Функция отображения картинки расположена в сопутствующем cpp файле, объявлена в соответствующем h файле, вызывается в основном файле (main.cpp) дважды: из функции show() и функции input(). Проблема в том, что в первом случае я вижу картинки аво втором - нет.:(
пс Изображения загружены в файл *.rc
код, может, чето лишнее, но я знаю где смотреть уже ошибку..
//////////////////////////////////////////////////////////////////
////main.cpp
#include "sea_battle.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void show();
void game_begin();
int check_ending();
void input();
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) //создание окна
{
MSG msg;
KWnd mainWnd("Морской бой", hInstance, nCmdShow, WndProc);
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) //обработка сообщений
{
char buffer[4];
HDC hDC;
PAINTSTRUCT ps;
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN: //нажатие лев кнопки мыши
if (game_is_on)
{
input_x = LOWORD(lParam);
input_y = HIWORD(lParam);
if (((input_x > delta*13) & (input_x < delta*23)) & ((input_y > delta) & (input_y < delta*11)))
{
input_x = (input_x / delta) - 13;
input_y = (input_y / delta) - 1;
input();
}
}
break;
case WM_COMMAND: //кнопка НАЧАТЬ
if(LOWORD(wParam)==10000)
{
hdc = GetDC(hWnd);
hwnd = hWnd;
game_begin();
ReleaseDC(hWnd,hdc);
}
if(LOWORD(wParam)==10001)
{
/* hDC = GetDC(hWnd);
ReleaseDC(hWnd,hDC);*/
}
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
void show()
{
RECT rect;
GetClientRect(hwnd, &rect);
char buffer[4];
int i,j;
for (i=0;i<=delta*23;i++)
for (j=0;j<delta*11;j++)
SetPixel(hdc,i,j,RGB(255, 255, 255));
for (i=1;i<=11;i++)
{
MoveToEx(hdc, i*delta, delta, NULL); //левая сетка
LineTo(hdc, i*delta, 11*delta);
if (i != 11)
TextOut(hdc, 3 ,delta*i , itoa(i, buffer, 10) ,strlen(itoa(i, buffer, 10)));
MoveToEx(hdc, delta, i*delta, NULL);
LineTo(hdc, 11*delta, i*delta);
if (i != 11)
TextOut(hdc, delta*i, 3, itoa(i, buffer, 10) ,strlen(itoa(i, buffer, 10)));
MoveToEx(hdc, (12 + i)*delta, delta, NULL); //правая сетка
LineTo(hdc, (12 + i)*delta, 11*delta);
if (i != 11)
TextOut(hdc, 3 + 12*delta ,delta*i , itoa(i, buffer, 10) ,strlen(itoa(i, buffer, 10)));
MoveToEx(hdc, 13*delta, i*delta, NULL);
LineTo(hdc, 23*delta, i*delta);
if (i != 11)
TextOut(hdc, (12 + i)*delta , 3, itoa(i, buffer, 10) ,strlen(itoa(i, buffer, 10)));
}
for (i=0;i<10;i++)
for (j=0;j<10;j++)
if (human.ships[j] == 2)
draw_ship(i,j,true,ship); //// та самая функция, которая в этом случае срабатывает,
//картинку видно
}
void game_begin()
{
int message = 0; // переменная хранит коды сообщений
// установка начального значения генератора случайных чисел
srand( static_cast<unsigned int>(time(NULL)) );
human.ships_init(); // инициализация массивов человека
computer.ships_init(); // инициализация массивов компьютера
show();
game_is_on = true;
}
void input()
{
//human.turn(computer, input_x, input_y);
draw_ship(5, 9, false, ship); //картинку НЕ ВИДНО!!!!!
}
///////////////////////////////////////////////////////////////
//sea_battle.h
#include "KWnd.h"
#include "resource.h"
#include <ctime>
using namespace std;
enum direction{h,v};
enum picture{ship, destroyed_ship, shot};
class player
{
public:
bool defeat_flag; // переменная хранит информацию о поражении
int hits[10][10]; // массив "выстрелов" объекта
int ships[10][10]; // массив кораблей объекта
player (): defeat_flag(0) {} // конструктор
void ships_init();
void set(int deck);
int place_ship(int s, int c, direction dir, int deck);
void turn(player&, int character, int digit); //ход игрока
void turn(player&); //ход компьютера
};
void clear(int x, int y);
void draw_ship(int x, int y, bool left, picture current); // ТА САМАЯ ФУНКЦИЯ!!!
extern player human;
extern player computer;
extern int delta; //размеры ячейки в пикселах
extern bool game_is_on; //ожидание хода
extern int input_x, input_y; //координаты мыши
extern HWND hwnd;
extern HDC hdc;
extern HDC hMemDC; // контекст устройства в памяти
/////////////////////////////////////////////////////////////////////////////////
// sea_battle.cpp
#include "sea_battle.h"
#include <windows.h>
player human;
player computer;
int delta = 30; //размеры ячейки в пикселах
bool game_is_on = false; //ожидание хода
int input_x, input_y; //координаты мыши
HWND hwnd;
HDC hdc;
HDC hMemDC; // контекст устройства в памяти
void clear(int x, int y)
{
for (int i=(x+1)*delta+1;i<(x+2)*delta;i++)
for (int j=(y+1)*delta+1;j<(y+2)*delta;j++)
SetPixel(hdc,i,j,RGB(255, 255, 255));
}
void draw_ship(int x, int y, bool left, picture current) // ТА САМАЯ ФУНКЦИЯ
{
int xp, yp;
static HBITMAP hBmpShip; // дескриптор растра
HINSTANCE hInst;
static BITMAP bm; // параметры растра
hInst = GetModuleHandle(NULL);
hMemDC = CreateCompatibleDC(hdc);
switch (current)
{
case ship:
hBmpShip = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_SHIP));
break;
case destroyed_ship:
hBmpShip = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_DESTROYED_SHIP));
break;
case shot:
hBmpShip = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_SHOT));
break;
}
GetObject(hBmpShip, sizeof(bm), (LPSTR)&bm);
SelectObject(hMemDC, hBmpShip);
if (left)
xp = (x+1)*delta+3;
else
xp = (x+13)*delta+3;
yp = (y+1)*delta+3;
char bufer[7];
BitBlt(hdc, xp, yp, bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
}