Got it working.
Clearly I didn't realize I had a "WndProc" all ready in the code.
However I have another question.
Now I'm trying to display a sprite (knight.png) in my main win32 window.
I achieved this. However, for some reason:
1) The background is black and not default gray
2) When I scroll with my scrollbars, the background changes to gray and erases my sprite while scrolling, and puts the background color back to black and draws my sprite again after I stop scrolling.
Here's my updated code with drawing a sprite in a Win32 window:
////////////////////////////////////////////////////////////
// Headers
////////////////////////////////////////////////////////////
#include <SFML/Graphics.hpp>
#include <windows.h>
#include <cmath>
HWND button;
////////////////////////////////////////////////////////////
/// Function called whenever one of our windows receives a message
///
////////////////////////////////////////////////////////////
LRESULT CALLBACK onEvent(HWND handle, UINT message, WPARAM wParam, LPARAM lParam)
{
SCROLLINFO si;
RECT clientRect;
GetClientRect(handle, &clientRect);
int iVertPos, iHorzPos;
switch (message)
{
case WM_CREATE:
MessageBox(handle, TEXT("MESSAGE"), TEXT("Hello"), 0);
break;
case WM_HSCROLL:
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
GetScrollInfo(handle, SB_HORZ, &si);
iHorzPos = si.nPos;
switch (LOWORD(wParam))
{
case SB_LINELEFT:
si.nPos -=1;
break;
case SB_LINERIGHT:
si.nPos += 1;
break;
case SB_PAGELEFT:
si.nPos -= si.nPage;
break;
case SB_PAGERIGHT:
si.nPos += si.nPage;
break;
case SB_THUMBTRACK:
si.nPos = si.nTrackPos;
break;
default:
break;
}
si.fMask = SIF_POS;
SetScrollInfo(handle, SB_HORZ, &si, TRUE);
GetScrollInfo(handle, SB_HORZ, &si);
if (si.nPos != iHorzPos)
{
InvalidateRect(handle, &clientRect, TRUE);
UpdateWindow(handle);
}
return 0;
case WM_VSCROLL:
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
GetScrollInfo(handle, SB_VERT, &si);
iVertPos = si.nPos;
switch(LOWORD(wParam)){
case SB_TOP:
si.nPos = si.nMin;
break;
case SB_BOTTOM:
si.nPos = si.nMax;
break;
case SB_LINEUP:
si.nPos--;
break;
case SB_LINEDOWN:
si.nPos++;
break;
case SB_PAGEUP:
si.nPos -= si.nPage;
break;
case SB_PAGEDOWN:
si.nPos += si.nPage;
break;
case SB_THUMBTRACK:
si.nPos = si.nTrackPos;
break;
default:
break;
}
si.fMask = SIF_POS;
SetScrollInfo(handle, SB_VERT, &si, TRUE);
GetScrollInfo(handle, SB_VERT, &si);
if(iVertPos != si.nPos){
InvalidateRect(handle, &clientRect, TRUE);
UpdateWindow(handle);
}
return 0;
// Quit when we close the main window
case WM_CLOSE :
{
PostQuitMessage(0);
return 0;
}
// Quit when we click the "quit" button
case WM_COMMAND :
{
if (reinterpret_cast<HWND>(lParam) == button)
{
PostQuitMessage(0);
return 0;
}
}
}
return DefWindowProc(handle, message, wParam, lParam);
}
LRESULT CALLBACK freqEvent(HWND handle, UINT message, WPARAM wParam, LPARAM lParam){
switch(message){
case WM_CREATE:
break;
}
return DefWindowProc(handle, message, wParam, lParam);
}
////////////////////////////////////////////////////////////
/// Entry point of application
///
/// \param Instance : Instance of the application
///
/// \return Error code
///
////////////////////////////////////////////////////////////
INT WINAPI WinMain(HINSTANCE instance, HINSTANCE, LPSTR, INT)
{
// Define a class for our main window
WNDCLASS windowClass;
windowClass.style = 0;
windowClass.lpfnWndProc = &onEvent;
windowClass.cbClsExtra = 0;
windowClass.cbWndExtra = 0;
windowClass.hInstance = instance;
windowClass.hIcon = NULL;
windowClass.hCursor = 0;
windowClass.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_BACKGROUND);
windowClass.lpszMenuName = NULL;
windowClass.lpszClassName = TEXT("Main");
RegisterClass(&windowClass);
// Define a class for our frequency window
WNDCLASS freqClass;
freqClass.style = 0;
freqClass.lpfnWndProc = &freqEvent;
freqClass.cbClsExtra = 0;
freqClass.cbWndExtra = 0;
freqClass.hInstance = instance;
freqClass.hIcon = NULL;
freqClass.hCursor = 0;
freqClass.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_BACKGROUND);
freqClass.lpszMenuName = NULL;
freqClass.lpszClassName = TEXT("Freq");
RegisterClass(&freqClass);
sf::Texture texture;
if (!texture.loadFromFile("knight.png"))
{
// error...
}
sf::Sprite sprite;
sprite.setTexture(texture);
// Main Window
HWND window = CreateWindow(TEXT("Main"), TEXT("Sound Editor"), WS_SYSMENU | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL, 200, 200, 660, 520, NULL, NULL, instance, NULL);
//Frequency Window
HWND freqWnd = CreateWindow(TEXT("Freq"), TEXT("Frequency"), WS_SYSMENU | WS_VISIBLE, 200, 200, 660, 520, NULL, NULL, instance, NULL);
// Add a button for exiting
button = CreateWindow(TEXT("BUTTON"), TEXT("Quit"), WS_CHILD | WS_VISIBLE, 560, 440, 80, 40, window, NULL, instance, NULL);
sf::RenderWindow SFMLViewMain(window);
// Let's create two SFML views
/*
HWND view1 = CreateWindow(TEXT("STATIC"), NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 20, 20, 300, 400, window, NULL, instance, NULL);
HWND view2 = CreateWindow(TEXT("STATIC"), NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 340, 20, 300, 400, window, NULL, instance, NULL);
sf::RenderWindow SFMLView1(view1);
sf::RenderWindow SFMLView2(view2);
*/
// Create a clock for measuring elapsed time
sf::Clock clock;
// Loop until a WM_QUIT message is received
MSG message;
message.message = static_cast<UINT>(~WM_QUIT);
while (message.message != WM_QUIT)
{
if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
{
// If a message was waiting in the message queue, process it
TranslateMessage(&message);
DispatchMessage(&message);
}
else
{
float time = clock.getElapsedTime().asSeconds();
SFMLViewMain.clear();
SFMLViewMain.draw(sprite);
SFMLViewMain.display();
// Clear views
/*
SFMLView1.clear();
SFMLView2.clear();
// Display each view on screen
SFMLView1.display();
SFMLView2.display();
*/
}
}
// Destroy the main window (all its child controls will be destroyed)
DestroyWindow(window);
DestroyWindow(freqWnd);
// Don't forget to unregister the window class
UnregisterClass(TEXT("Main"), instance);
UnregisterClass(TEXT("Freq"), instance);
return EXIT_SUCCESS;
}