Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Отображение растровой картинки, Морской бой на С++ , Win32 проект

40K
20 апреля 2011 года
NikiFoR112
13 / / 11.12.2008
Добрый день!! Прошу подсказки, возможно просто чего-то не вижу по глупости, но не понимаю где косяк, хоть убей:confused::confused:

пишу морской бой, проблема с графическим выводом предварительно сохраненного 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);

}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог