Need help with Bitmap Display
This code is expanding on the forger's windows programming tutorial; bmp_one (simply displays a static bitmap of a ball on a screen).
I am attempting to load an array of HBITMAPS (deck[53]) with a bunch of bitmaps of playing cards I scanned earlier today.. and display 5 random cards from the deck onto the main window.
I can get the code to work if I omit trying to load the deck[53] and just btblt( ) one specific card.
Can anyone spot the problemo...?? :confused:
using codeblocks v8.02
resource.h
Code:
#define ID_2OFSPADES 100
#define ID_2OFCLUBS 101
#define ID_2OFHEARTS 102
#define ID_2OFDIAMONDS 103
#define ID_3OFSPADES 104
#define ID_3OFCLUBS 105
#define ID_3OFHEARTS 106
#define ID_3OFDIAMONDS 107
#define ID_4OFSPADES 108
#define ID_4OFCLUBS 109
#define ID_4OFHEARTS 110
#define ID_4OFDIAMONDS 111
#define ID_5OFSPADES 112
#define ID_5OFCLUBS 113
#define ID_5OFHEARTS 114
#define ID_5OFDIAMONDS 115
#define ID_6OFSPADES 116
#define ID_6OFCLUBS 117
#define ID_6OFHEARTS 118
#define ID_6OFDIAMONDS 119
#define ID_7OFSPADES 120
#define ID_7OFCLUBS 121
#define ID_7OFHEARTS 122
#define ID_7OFDIAMONDS 123
#define ID_8OFSPADES 124
#define ID_8OFCLUBS 125
#define ID_8OFHEARTS 126
#define ID_8OFDIAMONDS 127
#define ID_9OFSPADES 128
#define ID_9OFCLUBS 129
#define ID_9OFHEARTS 130
#define ID_9OFDIAMONDS 131
#define ID_10OFSPADES 132
#define ID_10OFCLUBS 133
#define ID_10OFHEARTS 134
#define ID_10OFDIAMONDS 135
#define ID_JOFSPADES 136
#define ID_JOFCLUBS 137
#define ID_JOFHEARTS 138
#define ID_JOFDIAMONDS 139
#define ID_QOFSPADES 140
#define ID_QOFCLUBS 141
#define ID_QOFHEARTS 142
#define ID_QOFDIAMONDS 143
#define ID_KOFSPADES 144
#define ID_KOFCLUBS 145
#define ID_KOFHEARTS 146
#define ID_KOFDIAMONDS 147
#define ID_AOFSPADES 148
#define ID_AOFCLUBS 149
#define ID_AOFHEARTS 150
#define ID_AOFDIAMONDS 151
#define ID_BACKOFCARD 152
main.cpp
Code:
#include <windows.h>
#include "resource.h"
#include <ctime>
const char g_szClassName[] = "myWindowClass";
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static HBITMAP deck[53];
static HBITMAP hbmOld;
switch(msg)
{
case WM_CREATE:
srand(time(NULL));
for(int i=0, j=ID_2OFSPADES; i<53; i++, j++)
{
deck[i] = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(j));
if(deck[i] == NULL)
{
MessageBox(hwnd, "Could not load cards!", "Error", MB_OK | MB_ICONEXCLAMATION);
}
}
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_PAINT:
{
// Just a note, never use a MessageBox from inside WM_PAINT
// The box will cause more WM_PAINT messages and you'll probably end up
// stuck in a loop
BITMAP bm;
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
HDC hdcMem = CreateCompatibleDC(hdc);
for (int i=0, j=100; i<5; i++, j+=300)
{
hbmOld = (HBITMAP)SelectObject(hdcMem, deck[rand()%53]);
GetObject(deck[i], sizeof(bm), &bm);
BitBlt(hdc, j, 100, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
}
SelectObject(hdcMem,hbmOld);
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
}
break;
case WM_DESTROY:
for(int i=0; i<53; i++)
{
DeleteObject(deck[i]);
}
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wc;
HWND hwnd;
MSG Msg;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(0,255,0));
wc.lpszMenuName = NULL;
wc.lpszClassName = g_szClassName;
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Window Registration Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
hwnd = CreateWindowEx(
WS_EX_CLIENTEDGE,
g_szClassName,
"Blackjack v1.0",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 900,500,
NULL, NULL, hInstance, NULL);
if(hwnd == NULL)
{
MessageBox(NULL, "Window Creation Failed!", "Error!",
MB_ICONEXCLAMATION | MB_OK);
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}
resource.rc
Code:
#include "resource.h"
ID_2OFSPADES BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\2 of spades.bmp"
ID_2OFCLUBS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\2 of clubs.bmp"
ID_2OFHEARTS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\2 of hearts.bmp"
ID_2OFDIAMONDS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\2 of diamonds.bmp"
ID_3OFSPADES BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\3 of spades.bmp"
ID_3OFCLUBS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\3 of clubs.bmp"
ID_3OFHEARTS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\3 of hearts.bmp"
ID_3OFDIAMONDS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\3 of diamonds.bmp"
ID_4OFSPADES BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\4 of spades.bmp"
ID_4OFCLUBS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\4 of clubs.bmp"
ID_4OFHEARTS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\4 of hearts.bmp"
ID_4OFDIAMONDS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\4 of diamonds.bmp"
ID_5OFSPADES BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\5 of spades.bmp"
ID_5OFCLUBS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\5 of clubs.bmp"
ID_5OFHEARTS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\5 of hearts.bmp"
ID_5OFDIAMONDS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\5 of diamonds.bmp"
ID_6OFSPADES BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\6 of spades.bmp"
ID_6OFCLUBS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\6 of clubs.bmp"
ID_6OFHEARTS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\6 of hearts.bmp"
ID_6OFDIAMONDS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\6 of diamonds.bmp"
ID_7OFSPADES BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\7 of spades.bmp"
ID_7OFCLUBS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\7 of clubs.bmp"
ID_7OFHEARTS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\7 of hearts.bmp"
ID_7OFDIAMONDS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\7 of diamonds.bmp"
ID_8OFSPADES BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\8 of spades.bmp"
ID_8OFCLUBS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\8 of clubs.bmp"
ID_8OFHEARTS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\8 of hearts.bmp"
ID_8OFDIAMONDS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\8 of diamonds.bmp"
ID_9OFSPADES BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\9 of spades.bmp"
ID_9OFCLUBS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\9 of clubs.bmp"
ID_9OFHEARTS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\9 of hearts.bmp"
ID_9OFDIAMONDS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\9 of diamonds.bmp"
ID_10OFSPADES BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\10 of spades.bmp"
ID_10OFCLUBS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\10 of clubs.bmp"
ID_10OFHEARTS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\10 of hearts.bmp"
ID_10OFDIAMONDS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\10 of diamonds.bmp"
ID_JOFSPADES BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\jack of spades.bmp"
ID_JOFCLUBS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\jack of clubs.bmp"
ID_JOFHEARTS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\jack of hearts.bmp"
ID_JOFDIAMONDS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\jack of diamonds.bmp"
ID_QOFSPADES BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\queen of spades.bmp"
ID_QOFCLUBS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\queen of clubs.bmp"
ID_QOFHEARTS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\queen of hearts.bmp"
ID_QOFDIAMONDS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\queen of diamonds.bmp"
ID_KOFSPADES BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\king of spades.bmp"
ID_KOFCLUBS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\king of clubs.bmp"
ID_KOFHEARTS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\king of hearts.bmp"
ID_KOFDIAMONDS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\king of diamonds.bmp"
ID_AOFSPADES BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\ace of spades.bmp"
ID_AOFCLUBS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\ace of clubs.bmp"
ID_AOFHEARTS BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\ace of hearts.bmp"
ID_BACKOFCARD BITMAP DISCARDABLE "C:\\Users\\Dsve\\Desktop\\Card Bitmaps\\back of card.bmp"
Bitmap display after button press help
That missing bitmap location in the resource script solved a lot of me' problems.. thanks novacain.
My next task I would like to accomplish is to have a card bitmap display to the window whenever the, "HIT ME!" button is pressed.. everything looks alright to me... but whenever I press the button, nothing happens. Any suggestions..?? :confused:
main.cpp
Code:
#include<windows.h>
#include<algorithm>
#include<ctime>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
////////////////////////////////////////////////////////////////
/* window creation and registration stuff here */
//////////////////////////////////////////////////////////////
class Blackjack
{
public:
//Constructor
Blackjack(HWND);
//Destructor
//~Blackjack();
//WinProc Functions
void create(HWND);
void command(HWND,WPARAM, LPARAM);
void paint();
void close(HWND);
int destroy(HWND);
//Other Functions
void get_card_player();
void get_card_dealer();
void shuffle();
private:
BITMAP bm;
PAINTSTRUCT ps;
HBITMAP deck[53];
HBITMAP hbmOld;
HWND hHit;
HWND hStay;
HDC hdc;
HDC hdcMem;
int card[52];
int current_hand_value;
int card_counter;
int player_card_coord_x,
player_card_coord_y,
dealer_card_coord_x,
dealer_card_coord_y;
};
enum{ID_hit, ID_stay};
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static Blackjack myBlackjack(hwnd);
switch(msg)
{
case WM_CREATE: myBlackjack.create(hwnd); break;
case WM_COMMAND: myBlackjack.command(hwnd, wParam, lParam); break;
//case WM_PAINT: myBlackjack.command(hwnd, wParam, lParam); break;
case WM_CLOSE: myBlackjack.close(hwnd); break;
case WM_DESTROY: myBlackjack.destroy(hwnd); break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
Blackjack::Blackjack(HWND hwnd)
{
for(int i=0; i<52; i++)
{
card[52] = i;
}
//random_shuffle(&card[0], &card[52]);
hdc = BeginPaint(hwnd, &ps);
hdcMem = CreateCompatibleDC(hdc);
player_card_coord_x = 100;
player_card_coord_y = 300;
dealer_card_coord_x = 100;
dealer_card_coord_y = 50;
}
/*
Blackjack::~Blackjack(HWND hwnd)
{
}
*/
void Blackjack::create(HWND hwnd)
{
srand(time(NULL));
hHit = CreateWindow("BUTTON", "HIT ME!",
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
100, 500, 200, 50, hwnd, (HMENU)ID_hit,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
hStay = CreateWindow("BUTTON", "STAY",
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
500, 500, 200, 50, hwnd, (HMENU)ID_stay,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
for(int i=0, j=ID_2OFSPADES; i<53; i++, j++)
{
deck[i] = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(j));
if(deck[i] == NULL)
{
MessageBox(hwnd, "Could Not Load Card!", "Error", MB_OK | MB_ICONEXCLAMATION);
}
}
}
void Blackjack::command(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
WORD msg = LOWORD(wParam);
if(HIWORD(wParam) == BN_CLICKED)
{
if(msg == ID_hit)
{
get_card_player();
}
else if(msg == ID_stay)
{
get_card_dealer();
}
}
}
void Blackjack::paint()
{
return;
}
void Blackjack::close(HWND hwnd)
{
DestroyWindow(hwnd);
}
int Blackjack::destroy(HWND hwnd)
{
for(int i=0; i<53; i++)
{
DeleteObject(deck[i]);
}
SelectObject(hdcMem,hbmOld);
DeleteDC(hdcMem);
EndPaint(hwnd, &ps);
PostQuitMessage(0);
return 0;
}
void Blackjack::get_card_player()
{
hbmOld = (HBITMAP)SelectObject(hdcMem,deck[card[card_counter]]);
GetObject(deck[card[card_counter]], sizeof(bm), &bm);
BitBlt(hdc, player_card_coord_x+=200, 300, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);
card_counter+=1;
}
void Blackjack::get_card_dealer()
{
}
void Blackjack::shuffle()
{
//random_shuffle(&card[0], &card[52]);
}