一个字符串移动 变色 且可以调整界面的宽度的 WINDOWS程序
(很简单,重要的还是要知道WINDOWS程序运行的特点)
#include <windows.h>
LPCTSTR lpszAppName =TEXT("MyApp");
LPCTSTR lpszTitle =TEXT("My Application");
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{ SIZE size;
MSG msg;
HWND hWnd;
WNDCLASS wc;
// Register the main application window class.
//............................................
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
wc.hCursor = LoadCursor(NULL,IDC_SIZEALL);
wc.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );
wc.lpszMenuName = lpszAppName;
wc.lpszClassName = lpszAppName;
if ( !RegisterClass( &wc ) )
return( FALSE );
// Create the main application window.
//....................................
hWnd = CreateWindow( lpszAppName,
lpszTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0,
CW_USEDEFAULT, 0,
NULL,
NULL,
hInstance,
NULL
);
if ( !hWnd )
return( FALSE );
ShowWindow( hWnd, nCmdShow );
UpdateWindow( hWnd );
while( GetMessage( &msg, NULL, 0, 0) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
return( msg.wParam );
}
//窗口信息处理
LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
static int uRed = 0, flags=0,uGreen = 0, uBlue = 0;
static int times=0,cxClient,cyClient,x=100;
SIZE size;
int cx=30;
TCHAR szBuffer[40]; // wsprintf所需要的缓冲区,他返回的是字符的大小~~
TCHAR *SHOWWORD;
TCHAR *LP;
LPSIZE lpSize; //定义指向SIZE结构体的指针,后面GET--要用
lpSize=&size;
SHOWWORD="ABCDE";
LP=SHOWWORD;
switch( uMsg )
{
case WM_CREATE:
break;
case WM_SIZE:
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
break;
case WM_PAINT :
HDC hdc; // 对于题目的分析 1 对Y进行左移右移cx,flags=0标置向前走,flags=1标志向后走
PAINTSTRUCT ps;
// 当首字符,靠近边界时,且下一步y小于0时,可将其置为y=0位置,当判断最后一个字符超过了目前平面的位置时,
//可以,在最后一步,根据对字符长度的计算,重新确定Y使最后一个字符靠近边界,不留余地
//重点函数GetClientRect获取用户尺寸,可以再初次进入WM_CREATE中使用一次,以后
//便通过窗口过程处理 WM_SIZE消息动态的获取窗口尺寸的大小
//通过GetTextExtentPoint32获取字符的精确大小
hdc = BeginPaint(hWnd, &ps);
SetTextColor( hdc, RGB(uRed, uGreen, uBlue));
GetTextExtentPoint32(hdc,LP,lstrlen(TEXT("ABCDE")),lpSize);//此函数的使用如下,LP是指向
if(flags==0) //向前走的处理
{{ x=x-cx;}
if(x<0)
x=0;}
if(flags==1)//向后走的处理
{ { x=x+cx;}
if ((x+size.cx)>cxClient)
{ x=cxClient-size.cx;
}}
TextOut(hdc,x,100,SHOWWORD,lstrlen(SHOWWORD));
if(x==0)
flags=1;
if((x+size.cx)==cxClient)
flags=0;
EndPaint(hWnd, &ps);
break;
case WM_KEYDOWN :
{
uRed = rand() % 255;
uGreen = rand() % 255;
uBlue = rand() % 255;
InvalidateRect(hWnd, FALSE,TRUE);//这个函数会让整个客户区无效,从而调用WM_PAINT进行操作,最后一个参数确定是否擦除背景
}
break;
case WM_DESTROY :
PostQuitMessage(0);
break;
default :
return( DefWindowProc( hWnd, uMsg, wParam, lParam ) );
}
return( 0L );
}