VBdemo: C/C++ Version
Note how the Paste item on the top-level menu is enabled through the IDM_CUT menu handler with the EnableMenuItem() and DrawMenuBar() Windows API functions. We've already seen the EnableMenuItem() function in action, but DrawMenuBar() is new. When we change the top-level menu, Windows does not immediately redraw the menu bar, so we must call DrawMenuBar() to do this. If we didn't, the Paste menu item would be enabled but would still appear grayed out.
/****************************************************************************\
* *
* VBdemo.c *
* *
* This program demonstrates how to copy the contents of one virtual buffer *
* to another, with and without transparent colors. *
* *
\****************************************************************************/
#include <fgwin.h>
#include "VBdemo.h"
#define vbWidth 640
#define vbHeight 480
LRESULT CALLBACK WindowProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdParam, int iCmdShow)
{
static char szAppName[] = "FGvbdemo";
HWND hWnd;
MSG msg;
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof(wndclass);
wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
wndclass.lpfnWndProc = WindowProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL,IDC_ARROW);
wndclass.hbrBackground = NULL;
wndclass.lpszMenuName = szAppName;
wndclass.lpszClassName = szAppName;
wndclass.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
RegisterClassEx(&wndclass);
hWnd = CreateWindow(szAppName, // window class name
"Virtual Buffer Copy Demo", // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL); // creation parameters
ShowWindow(hWnd,iCmdShow);
UpdateWindow(hWnd);
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
/****************************************************************************\
* *
* WindowProc() *
* *
\****************************************************************************/
HDC hDC;
HMENU hMenu;
HPALETTE hPal;
int hVB1, hVB2;
UINT cxClient, cyClient;
LRESULT CALLBACK WindowProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
switch (iMsg)
{
case WM_CREATE:
hDC = GetDC(hWnd);
fg_setdc(hDC);
hPal = fg_defpal();
fg_realize(hPal);
fg_vbinit();
hVB2 = fg_vballoc(vbWidth,vbHeight);
fg_vbopen(hVB2);
fg_vbcolors();
hVB1 = fg_vballoc(vbWidth,vbHeight);
fg_vbopen(hVB1);
fg_vbcolors();
fg_setcolor(25);
fg_fillpage();
fg_setcolor(20);
fg_rect(vbWidth/4,vbWidth*3/4,vbHeight/4,vbHeight*3/4);
hMenu = GetMenu(hWnd);
return 0;
case WM_COMMAND:
switch (wParam)
{
case IDM_Cut:
fg_vbcopy(0,vbWidth-1,0,vbHeight-1,0,vbHeight-1,hVB1,hVB2);
fg_erase();
fg_vbscale(0,vbWidth-1,0,vbHeight-1,0,cxClient-1,0,cyClient-1);
EnableMenuItem(hMenu,IDM_Paste,MF_ENABLED);
DrawMenuBar(hWnd);
return 0;
case IDM_Paste:
fg_tcdefine(25,1);
fg_vbtccopy(0,vbWidth-1,0,vbHeight-1,0,vbHeight-1,hVB2,hVB1);
fg_vbscale(0,vbWidth-1,0,vbHeight-1,0,cxClient-1,0,cyClient-1);
return 0;
case IDM_Exit:
DestroyWindow(hWnd);
return 0;
}
break;
case WM_PAINT:
BeginPaint(hWnd,&ps);
fg_vbscale(0,vbWidth-1,0,vbHeight-1,0,cxClient-1,0,cyClient-1);
EndPaint(hWnd,&ps);
return 0;
case WM_SETFOCUS:
fg_realize(hPal);
InvalidateRect(hWnd,NULL,TRUE);
return 0;
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
case WM_DESTROY:
fg_vbclose();
fg_vbfree(hVB1);
fg_vbfree(hVB2);
fg_vbfin();
DeleteObject(hPal);
ReleaseDC(hWnd,hDC);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,iMsg,wParam,lParam);
}
|