Code:
// First Windows app.cpp : Defines the entry point for the application.
/*
To do before making the first useful Windows application - what background scaling is (or "The Supernatural Olympics" version 1.1):
Draw images
Syncronize drawing images with monitor refresh rate
Call a function upon pressing a key
*/
/* Trim fat from windows*/
#define WIN32_LEAN_AND_MEAN
#pragma comment(linker, "/subsystem:windows")
/* Pre-processor directives*/
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
// defines and global vars
#define x 0
#define y 1
short screen_size[2]; // screen resolution (e.g. 1920x1440)
short window_size_base[2]; // expected window size
short window_size[2]; // actual window size
short window_pos[2]; // window position
short title_bar_height; // height of the title bar in pixels
short window_border[2]; // size of the window border
int file_handle; // handle for reading/writing files
char bmp_image[]; // data for the bitmap image
int *img_handle; // pointer for a handle
int *HDC_handle; // pointer for HDC handle
BITMAPINFOHEADER bmp_head;
void draw_test_image()
{
img_handle = DrawDibOpen();
file_handle = fopen("C:\\My Documents\\My programs\\ulillilliacity.bmp", "rb"); // read the source BMP file to display, binary mode
fseek(file_handle, 2, seek_set); // skip the first two bytes, the file identifier, the string "BM"
// fill the struct reading from the file
fread(&bmp_head.biSize, 4, 1, file_handle); // actual file size
// 12 bytes missing here, according to what I'm seeing in the hex edittor
fread(&bmp_head.biWidth, 4, 1, file_handle);
fread(&bmp_head.biHeight, 4, 1, file_handle);
fread(&bmp_head.biPlanes, 2, 1, file_handle);
fread(&bmp_head.biBitCount, 2, 1, file_handle);
fread(&bmp_head.biCompression, 4, 1, file_handle);
fread(&bmp_head.biSizeImage, 4, 1, file_handle);
fread(&bmp_head.biXPelsPerMeter, 4, 1, file_handle);
fread(&bmp_head.biYPelsPerMeter, 4, 1, file_handle);
fread(&bmp_head.biClrUsed, 4, 1, file_handle);
fread(&bmp_head.biClrImportant, 4, 1, file_handle);
fread(&bmp_head.biClrImportant, 4, 1, file_handle);
fread(&bmp_image, 1, bmp_head.biSizeImage, file_handle); // read the remainder of the bits, the image data part
fclose(file_handle);
DrawDibDraw(img_handle, hDC, 64, 48, 512, 384, bmp_head, bmp_image, 64, 48, 512, 384, 0); // still not sure about the first group of numbers
DrawDibClose(img_handle); // free the resources
}
/* Windows Procedure Event Handler*/
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT paintStruct;
/* Device Context*/
HDC hDC; // is this the DC declaration?
/* Text for display*/
char string[] = "Image test - there should be an image below";
/* Switch message, condition that is met will execute*/
switch(message)
{
/* Window is being created*/
case WM_CREATE:
return 0;
break;
/* Window is closing*/
case WM_CLOSE:
PostQuitMessage(0);
return 0;
break;
/* Window needs update*/
case WM_PAINT:
hDC = BeginPaint(hwnd,&paintStruct);
/* Set txt color to blue*/
SetTextColor(hDC, COLORREF(0x00FF8040));
/* Display text in middle of window*/
TextOut(hDC,0,2,string,sizeof(string)-1);
EndPaint(hwnd, &paintStruct);
return 0;
break;
default:
break;
}
return (DefWindowProc(hwnd,message,wParam,lParam));
}
/* Main function*/
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX windowClass; //window class
HWND hwnd; //window handle
MSG msg; //message
bool done; //flag saying when app is complete
/* Fill out the window class structure*/
windowClass.cbSize = sizeof(WNDCLASSEX);
windowClass.style = CS_HREDRAW | CS_VREDRAW;
windowClass.lpfnWndProc = WndProc;
windowClass.cbClsExtra = 0;
windowClass.cbWndExtra = 0;
windowClass.hInstance = hInstance;
windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
windowClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
windowClass.lpszMenuName = NULL;
windowClass.lpszClassName = "MyClass";
windowClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
/* Register window class*/
if (!RegisterClassEx(&windowClass))
{
return 0;
}
/* SM_CXBORDER is 1
SM_CYBORDER is 1
SM_CXEDGE is 2
SM_CYEDGE is 2
SM_CXFIXEDFRAME is 3
SM_CYFIXEDFRAME is 3
SM_CXSIZEFRAME is 4
SM_CYSIZEFRAME is 4
SM_CYCAPTION is 18
*/
window_border[x] = GetSystemMetrics(SM_CXSIZEFRAME); // obtain border sizes, title bar height, and operating resolution
window_border[y] = GetSystemMetrics(SM_CYSIZEFRAME);
title_bar_height = GetSystemMetrics(SM_CYCAPTION); // obtain height of the title bar
screen_size[x] = GetSystemMetrics(SM_CXSCREEN); // operating resolution
screen_size[y] = GetSystemMetrics(SM_CYSCREEN);
window_size_base[x] = 640; // interior window size
window_size_base[y] = 480;
window_size[x] = window_size_base[x]+window_border[x]*2; // full window size, including borders and title bar
window_size[y] = window_size_base[y]+window_border[y]*2+title_bar_height;
window_pos[x] = (screen_size[x]/2)-(window_size[x]/2); // center the window
window_pos[y] = (screen_size[y]/2)-(window_size[y]/2);
/* Class registerd, so now create window*/
hwnd = CreateWindowEx(NULL, //extended style
"MyClass", //class name
"First Windows app", //app name
WS_OVERLAPPEDWINDOW | //window style
WS_VISIBLE |
WS_SYSMENU,
window_pos[x],window_pos[y], //x/y coords
window_size[x],window_size[y], //width,height
NULL, //handle to parent
NULL, //handle to menu
hInstance, //application instance
NULL); //no extra parameter's
/* Check if window creation failed*/
if (!hwnd)
return 0;
done = false; //initialize loop condition variable
/* main message loop*/
draw_test_image();
while(!done)
{
PeekMessage(&msg,hwnd,NULL,NULL,PM_REMOVE);
if (msg.message == WM_QUIT) //check for a quit message
{
free(*img_handle);
done = true; //if found, quit app
}
else
{
/* Translate and dispatch to event queue*/
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
These are my issues: