API - Create window help

Miscellaneous Forums/Win32 Discussion/API - Create window help

I'm playing around with WinAPI but getting bogged down with the ins and outs of windows controls.

I have a bit of code which displays a window and reports all WM messages to the WINPROCHANDLER() function.

Example Code - API Window (BlitzMax)

The main problems I have is,

1) How should I fill in the client area of the window?
This area is initially WHITE and shows the window title in the upper/left part:



However, moving the window around or moving other windows in front shows the inner area is not being drawn.
This image shows the area I wish to be permanently solid.
(The BLUE is the desktop background):



I'm not sure what to do here. So ...

1) Should I fill in the client area with a DC of the same size?
2) Is there a flag which does this for me?
3) How do I accurately get the correct client area/coordinates. Afterall, there are all sorts of parameters which affect the windows inner area (titlebar/statusbar, borders, etc..)
4) What if the user resizes/moves the window?
Again, how should I update the inner area?

Not sure if this is much use:-

LRESULT APIENTRY WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    PAINTSTRUCT ps; 
    HDC hdc; 
 
    switch (message) 
    { 
        case WM_PAINT: 
            hdc = BeginPaint(hwnd, &ps); 
            TextOut(hdc, 0, 0, "Hello!", 15); 
            EndPaint(hwnd, &ps); 
            return 0L; 

        // Process other messages.  
    } 
} 
 
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    HWND hwnd; 
 
    hwnd = CreateWindowEx( 
        // parameters 
        ); 
 
    ShowWindow(hwnd, SW_SHOW); 
    UpdateWindow(hwnd); <--- Call this if you want to update your window!
 
    return msg.wParam; 
} 



Basically, you call a WinAPI (GDI) function called UpdateWindow(hWnd), this sends a WM_PAINT event to your call back function, then you can draw your updated window again!

Dabz

Thanks Dabz but no luck yet. I get bewildered at the number of commands available for drawing windows, buttons and the likes.

I read up on InvalidateRect which seems like the right command to use but still no joy.

Maybe I am supposed to fill in the area with a STATIC borderless window(??) .. don't know really.

Jim, under normal usage you would call DefWindowProc() but hooking into blitzmax needs a little more work.

see this post here from a couple of months ago. where full hooking of blitzmax takes place.

http://www.blitzbasic.com/Community/posts.php?topic=50237

this should be of some help

kev

Check the hbrBackground member of your window class.

Ok folks. Thanks so far.

I think I've got the structure of MSG wrong though.
During the running of the program I get:

bad refs:obj=$e107a0 refs=$0

Here is how I have defined the structure using this C++ sample ..
typedef struct tagPOINT { // pt  
    LONG x; 
    LONG y; 
} POINT; 

typedef struct tagMSG {     // msg  
    HWND   hwnd;	 
    UINT   message; 
    WPARAM wParam; 
    LPARAM lParam; 
    DWORD  time; 
    POINT  pt; 
} MSG; 


Blitzmax
Type POINTAPI
	Field x%,y%
End Type

Type MESSAGE
    Field hWnd%
    Field Message%
    Field wParam:Byte Ptr
    Field lParam:Byte Ptr
    Field Time%
    Field pt:POINTAPI=New POINTAPI
End Type 

The problem seems to arise after GetMessage()
I've got a feeling its something to do with

Field pt:POINTAPI=New POINTAPI

Maybe that should be a byte ptr?

Latest version -> API Window (BlitzMax)