#include <windows.h>
#include <stdio.h>
#include <string.h>
// Global variable
HINSTANCE hInst;
HINSTANCE mhInst;
HWND mhWnd; // handle to own window (initialize in WinMain)
HDC mhDC; // device context (initialize in each Paint function calling)
// Function prototypes.
BOOL CALLBACK PrintEnumWindowsProc(HWND hWnd,LPARAM lParam);
void Paint(HWND hWnd);
// Function prototypes.
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
// Application entry point.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
BOOL bRet;
WNDCLASS wcx; // register class
HWND hWnd;
UINT uResult; // SetTimer's return value
hInst = hInstance; // Save the application-instance handle.
// Fill in the window class structure with parameters that describe the main window.
wcx.style = CS_HREDRAW | CS_VREDRAW; // redraw if size changes
wcx.lpfnWndProc = (WNDPROC) MainWndProc; // points to window procedure
wcx.cbClsExtra = 0; // no extra class memory
wcx.cbWndExtra = 0; // no extra window memory
wcx.hInstance = hInstance; // handle to instance
wcx.hIcon = LoadIcon(NULL, IDI_APPLICATION); // predefined app. icon
wcx.hCursor = LoadCursor(NULL, IDC_ARROW); // predefined arrow
wcx.hbrBackground = GetStockObject(WHITE_BRUSH); // white background brush
wcx.lpszMenuName = (LPCSTR) "MainMenu"; // name of menu resource
wcx.lpszClassName = (LPCSTR) "MainWClass"; // name of window class
// Register the window class.
if (!RegisterClass(&wcx)) return FALSE;
// create window of registered class
hWnd = CreateWindow(
"MainWClass", // name of window class
"LukeW", // title-bar string
WS_OVERLAPPEDWINDOW, // top-level window
50, // default horizontal position
50, // default vertical position
200, // default width
200, // default height
(HWND) NULL, // no owner window
(HMENU) NULL, // use class menu
hInstance, // handle to application instance
(LPVOID) NULL); // no window-creation data
if (!hWnd) return FALSE;
mhWnd = hWnd;
// Show the window and send a WM_PAINT message to the window procedure.
// Record the current cursor position.
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// loop of message processing
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int) msg.wParam;
}
LRESULT CALLBACK MainWndProc(
HWND hWnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam) // second message parameter
{
switch (uMsg)
{
case WM_MOVE:
//SendMessage(hWnd, WM_PAINT, 0, 0);
return 0;
case WM_PAINT:
InvalidateRect(hWnd, NULL, TRUE);
Paint(hWnd);
return 0;
case WM_CREATE:
// Initialize the window.
return 0;
case WM_SIZE:
// Set the size and position of the window.
return 0;
case WM_DESTROY:
// Clean up window-specific data objects.
PostQuitMessage(0);
return 0;
//
// Process other messages.
//
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
}
// funkce Paint se vola na udalost WM_PAINT
void Paint(HWND hWnd)
{
PAINTSTRUCT ps; // information can be used to paint the client area of a window owned by that application
mhDC = BeginPaint(hWnd, &ps); // prepares the specified window for painting (use global variable)
EnumWindows(&PrintEnumWindowsProc, 0); // process PrintEnumWindowsProc function to all existed windows
DeleteDC(mhDC); // deletes the specified device context
EndPaint(hWnd, &ps); // marks the end of painting in the specified window
}
BOOL CALLBACK PrintEnumWindowsProc(
HWND hWnd, // handle to some system window
LPARAM lParam // application-defined value
)
{
char text[256];
char WClassName[256];
char mWClassName[256];
RECT act;
RECT other;
GetClassName(hWnd, WClassName, 256); // get class name of some system window
GetClassName(mhWnd, mWClassName, 256); // get class name of your own window
if ((strcmp(WClassName,mWClassName) == 0) && // if names are same (we can suppose it is our application of our class)
(hWnd != mhWnd)) // and it is not the same application instance
{
GetWindowRect(mhWnd, &act);
GetWindowRect(hWnd, &other);
MoveToEx(mhDC, (act.right-act.left)/2, (act.bottom-act.top)/2, NULL );
LineTo(mhDC, (other.right+other.left)/2 , (other.top+other.bottom)/2 );
SendMessage(mhWnd, WM_PAINT, 0, 0); // repaint this window
}
return TRUE;
}