利用HDC随机在工作区随机颜色产生文字

这是一个GDI文本打印的演示程序,它在Windows窗口的工作区中随机生成不同颜色的文字。通过随机设置前景色和背景色,然后使用TextOut函数在随机位置绘制文本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// DEMO3_5.CPP - text printing demo

// INCLUDES ///////////////////////////////////////////////
#define WIN32_LEAN_AND_MEAN  // just say no to MFC

#include <windows.h>   // include all the windows headers
#include <windowsx.h>  // include useful macros
#include <mmsystem.h>  // very important and include WINMM.LIB too!
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// DEFINES ////////////////////////////////////////////////

// defines for windows
#define WINDOW_CLASS_NAME "WINCLASS1"

// GLOBALS ////////////////////////////////////////////////
HWND      main_window_handle = NULL; // globally track main window
HINSTANCE hinstance_app      = NULL; // globally track hinstance

// FUNCTIONS //////////////////////////////////////////////
LRESULT CALLBACK WindowProc(HWND hwnd,
          UINT msg,
                            WPARAM wparam,
                            LPARAM lparam)
{
// this is the main message handler of the system
PAINTSTRUCT  ps;  // used in WM_PAINT
HDC    hdc; // handle to a device context

// what is the message
switch(msg)
 { 
 case WM_CREATE:
        {
  // do initialization stuff here
        // return success
  return(0);
  } break;
 

 case WM_PAINT:
  {
  // simply validate the window
  hdc = BeginPaint(hwnd,&ps); 
  // you would do all your painting here
        EndPaint(hwnd,&ps);

        // return success
  return(0);
     } break;

 case WM_DESTROY:
  {

  // kill the application, this sends a WM_QUIT message
  PostQuitMessage(0);

        // return success
  return(0);
  } break;

 default:break;

    } // end switch

// process any messages that we didn't take care of
return (DefWindowProc(hwnd, msg, wparam, lparam));

} // end WinProc

// WINMAIN ////////////////////////////////////////////////
int WINAPI WinMain( HINSTANCE hinstance,
     HINSTANCE hprevinstance,
     LPSTR lpcmdline,
     int ncmdshow)
{

WNDCLASSEX winclass; // this will hold the class we create
HWND    hwnd;  // generic window handle
MSG     msg;   // generic message

// first fill in the window class stucture
winclass.cbSize         = sizeof(WNDCLASSEX);
winclass.style   = CS_DBLCLKS | CS_OWNDC |
                          CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra  = 0;
winclass.cbWndExtra  = 0;
winclass.hInstance  = hinstance;
winclass.hIcon   = LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor  = LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName = WINDOW_CLASS_NAME;
winclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);

// save hinstance in global
hinstance_app = hinstance;

// register the window class
if (!RegisterClassEx(&winclass))
 return(0);

// create the window
if (!(hwnd = CreateWindowEx(NULL,                  // extended style
                            WINDOW_CLASS_NAME,     // class
          "GDI Text Printing Demo", // title
          WS_OVERLAPPEDWINDOW | WS_VISIBLE,
           0,0,   // initial x,y
          400,400,  // initial width, height
          NULL,   // handle to parent
          NULL,   // handle to menu
          hinstance,// instance of this application
          NULL))) // extra creation parms
return(0);

// save main window handle
main_window_handle = hwnd;

// get the dc and hold it
HDC hdc = GetDC(hwnd); //获取一个hdc句柄

// enter main event loop, but this time we use PeekMessage()
// instead of GetMessage() to retrieve messages
while(TRUE)
 {
    // test if there is a message in queue, if so get it
 if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    {
    // test if this is a quit
       if (msg.message == WM_QUIT)
           break;
 
    // translate any accelerator keys
    TranslateMessage(&msg);

    // send the message to the window proc
    DispatchMessage(&msg);
    } // end if

    //在未有消息的情况下执行这些工作

    // main game processing goes here
   
    // set the foreground color to random 随机产生RGB色
    SetTextColor(hdc, RGB(rand()%256,rand()%256,rand()%256)); //The SetTextColor function sets the text color for the specified device context to the specified color
 //其中两个参数,一个是HDC,一个是COLORREF参数 The COLORREF value is used to specify an RGB color.  用来指明RGB颜色

    // set the background color to black //设置HDC的背景色
    SetBkColor(hdc, RGB(0,0,0)); //The SetBkColor function sets the current background color to the specified color value, or to the nearest physical color if the device cannot represent the specified color value

    // finally set the transparency mode to transparent 将HDC背景为透明
     SetBkMode(hdc, TRANSPARENT); //The SetBkMode function sets the background mix mode of the specified device context. The background mix mode is used with text, hatched brushes, and pen styles that are not solid lines

    // draw some text at a random location //向工作区用HDC画出随机的X,Y处写出"GDI Text Demo!",长度
    TextOut(hdc,rand()%400,rand()%400, "GDI Text Demo!", strlen("GDI Text Demo!"));

    Sleep(20); //让线程休眠10毫秒
 
 } // end while

// release the dc
ReleaseDC(hwnd,hdc);

// return to Windows like this
return(msg.wParam);

} // end WinMain

///////////////////////////////////////////////////////////

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值