#include "stdafx.h"
#include "Draw_sdk.h"
#define ID_TIMER 1
HWND hwnd0=0;
HINSTANCE hInstance0=0 ;
int nCmdShow0=0;
static TCHAR szAppName[] = TEXT ("DigClock") ;
LRESULT CALLBACK WndProc2 (HWND, UINT, WPARAM, LPARAM) ; #define MAX_LOADSTRING 100 // 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 // 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); //自己的函数
LRESULT CALLBACK SetColor(HWND, UINT, WPARAM, LPARAM);
BOOL RealDraw(HWND hWnd, int ROP2, int x, int y); //保存设置的一些全局变量
#define DRAW_LINE 1
#define DRAW_CIRCLE 2
#define DRAW_RECT 3
#define PEN 4
DWORD g_Color = RGB(255,0,0);//颜色,初值为红
DWORD g_Draw = DRAW_LINE; //画笔,默认为直线
int g_x=0,g_y=0; //鼠标左键按下时的坐标
int last_x=0,last_y=0; //前一次鼠标移动后,坐标
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
hInstance0=hInstance;
nCmdShow0=nCmdShow;
WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc2 ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("Program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable; // 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_DRAW_SDK, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance); // 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
} hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_DRAW_SDK); // 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return (int) msg.wParam;
} //
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
// 注释:
//
// 仅当希望在已添加到 Windows 95 的
// “RegisterClassEx”函数之前此代码与 Win32 系统兼容时,
// 才需要此函数及其用法。调用此函数
// 十分重要,这样应用程序就可以获得关联的
// “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_DRAW_SDK);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCTSTR)IDC_DRAW_SDK;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx(&wcex);
} //
// 函数: InitInstance(HANDLE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd; hInst = hInstance; // 将实例句柄存储在全局变量中 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd)
{
return FALSE;
} ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); return TRUE;
} void GetLargestDisplayMode (int * pcxBitmap, int * pcyBitmap)
{
DEVMODE devmode ;
int iModeNum = 0 ; * pcxBitmap = * pcyBitmap = 0 ; ZeroMemory (&devmode, sizeof (DEVMODE)) ;
devmode.dmSize = sizeof (DEVMODE) ;
while (EnumDisplaySettings (NULL, iModeNum++, &devmode))
{
* pcxBitmap = max (* pcxBitmap, (int) devmode.dmPelsWidth) ;
* pcyBitmap = max (* pcyBitmap, (int) devmode.dmPelsHeight) ;
}
} //
// 函数: WndProc(HWND, unsigned, WORD, LONG)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int idColor [5] = { WHITE_BRUSH, LTGRAY_BRUSH, GRAY_BRUSH,
DKGRAY_BRUSH, BLACK_BRUSH } ;
static int iSelection = IDM_BKGND_WHITE ;
HMENU hMenu ;
int wmId, wmEvent, color;
PAINTSTRUCT ps;
POINT point;
HWND hwnd ; GetCursorPos(&point);
ScreenToClient(hWnd, &point); switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
//处理菜单被选中状态
switch(wmId)
{
case ID_COLOR_RED:
case ID_COLOR_GREEN:
case ID_COLOR_BLUE:
case ID_COLOR_X:
//当某项被选择,先置空所有项,然后选中当前项
CheckMenuItem(GetMenu(hWnd), ID_COLOR_RED, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), ID_COLOR_GREEN, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), ID_COLOR_BLUE, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), ID_COLOR_X, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), wmId, MF_CHECKED);
break;
case ID_LINE:
case ID_CIRCLE:
case ID_RECT:
case ID_PEN:
//同上
CheckMenuItem(GetMenu(hWnd), ID_LINE, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), ID_CIRCLE, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), ID_RECT, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), ID_PEN, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), wmId, MF_CHECKED);
break;
}
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case ID_CLEAR:
//清除,也即刷新一遍窗口
RECT rect;
GetClientRect(hWnd, &rect);
InvalidateRect(hWnd, &rect, 1);
PostMessage(hWnd, WM_PAINT, NULL, NULL);
break;
case ID_COLOR_RED: g_Color = RGB(255,0,0); break; //红
case ID_COLOR_GREEN: g_Color = RGB(0,255,0); break; //绿
case ID_COLOR_BLUE: g_Color = RGB(0,0,255); break; //蓝
case ID_COLOR_X:
DialogBox(hInst, (LPCTSTR)IDD_XCOLOR, hWnd, (DLGPROC)SetColor); //弹出自定义颜色对话框
break;
case IDM_BKGND_WHITE: // Note: Logic below
case IDM_BKGND_LTGRAY: // assumes that IDM_WHITE
case IDM_BKGND_GRAY: // through IDM_BLACK are
case IDM_BKGND_DKGRAY: // consecutive numbers in
case IDM_BKGND_BLACK: // the order shown here.
CheckMenuItem (hMenu, iSelection, MF_UNCHECKED) ;
iSelection = LOWORD (wParam) ;
CheckMenuItem (hMenu, iSelection, MF_CHECKED) ;
color = LOWORD (wParam) - IDM_BKGND_WHITE;
SetClassLong (hWnd, GCL_HBRBACKGROUND, (LONG)
GetStockObject
(idColor [color])) ;
InvalidateRect (hWnd, NULL, TRUE) ;
return 0 ;
case ID_LINE: g_Draw = DRAW_LINE; break; //直线
case ID_CIRCLE: g_Draw = DRAW_CIRCLE; break; //圆
case ID_RECT: g_Draw = DRAW_RECT; break; //矩形
case ID_PEN: g_Draw = PEN; break; //自由画笔
case ID_DigClock:
hwnd0 = CreateWindow (szAppName, TEXT ("Digital Clock"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance0, NULL) ; ShowWindow (hwnd0, nCmdShow0) ;
UpdateWindow (hwnd0) ;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_LBUTTONDOWN:
{
g_x = point.x; //保存当前坐标
g_y = point.y;
last_x = 0; //清空前一个坐标
last_y = 0;
}
break;
case WM_LBUTTONUP:
{
if (last_x || last_y)
RealDraw(hWnd, R2_NOT, last_x, last_y); //如果前一坐标不为空,则反色清掉前一线
RealDraw(hWnd, R2_COPYPEN, point.x, point.y); //真正画完的图
}
break;
case WM_MOUSEMOVE:
if (wParam == MK_LBUTTON) //左键按下
{
if (g_Draw != PEN)
{
if (last_x || last_y)
RealDraw(hWnd, R2_NOT, last_x, last_y); //不为自由画笔时,实现橡皮筋线
RealDraw(hWnd, R2_NOT, point.x, point.y);
}
else
{
//自由画笔,其实就是记录所有鼠标位置,与前一点之间连线
HDC hdc = GetDC(hWnd);
HPEN hNewPen = CreatePen(PS_SOLID, 1, g_Color);
SelectObject(hdc, (HGDIOBJ)hNewPen); //画笔颜色
MoveToEx(hdc, last_x, last_y, NULL);
if (last_x || last_y)
LineTo(hdc, point.x, point.y);
DeleteObject((HGDIOBJ)hNewPen);
ReleaseDC(hWnd, hdc);
}
last_x = point.x; //记录鼠标当前位置
last_y = point.y;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
} // “关于”框的消息处理程序。
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE; case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
} // 设置自定义颜色对话框的消息处理程序。
LRESULT CALLBACK SetColor(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static int red=0, green=0, blue=0;
switch (message)
{
case WM_INITDIALOG:
//设三原色的初值
SetDlgItemInt(hDlg, IDC_RED, red, 1);
SetDlgItemInt(hDlg, IDC_GREEN, green, 1);
SetDlgItemInt(hDlg, IDC_BLUE, blue, 1);
return TRUE; case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
red = GetDlgItemInt(hDlg, IDC_RED, NULL, 1);
green = GetDlgItemInt(hDlg, IDC_GREEN, NULL, 1);
blue = GetDlgItemInt(hDlg, IDC_BLUE, NULL, 1);
if ( red < 0 || red > 255 ||
green < 0 || green > 255 ||
blue < 0 || blue > 255)
{
MessageBox(NULL, "颜色值只能是0~255之间!", "出错", 0); //错误处理
return FALSE;
} g_Color =RGB(red, green, blue); //直接保存颜色值 EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
BOOL RealDraw(HWND hWnd, int ROP2, int x, int y)
{
HDC hdc;
POINT point; GetCursorPos(&point); //得到鼠标屏幕坐标
ScreenToClient(hWnd, &point); //转成窗口坐标 hdc = GetDC(hWnd); SetROP2(hdc, ROP2); //实现橡皮筋线
//启用新画笔,实线
HPEN hNewPen = CreatePen(PS_SOLID, 1, g_Color);
SelectObject(hdc, (HGDIOBJ)hNewPen); //画刷,设为空
HGDIOBJ hStockobj = GetStockObject(NULL_BRUSH);
SelectObject(hdc, hStockobj); switch(g_Draw)
{
case DRAW_LINE:
MoveToEx(hdc, g_x, g_y, NULL);//直线
LineTo(hdc, x, y);
break;
case DRAW_RECT:
Rectangle(hdc, g_x, g_y, x, y);//矩形
break;
case DRAW_CIRCLE:
Ellipse(hdc, g_x, g_y, x, y);//圆
break;
default:
break;
} DeleteObject(hNewPen);
DeleteObject(hStockobj);
ReleaseDC(hWnd, hdc); return TRUE;
} void DisplayDigit (HDC hdc, int iNumber)
{
static BOOL fSevenSegment [10][7] = {
1, 1, 1, 0, 1, 1, 1, // 0
0, 0, 1, 0, 0, 1, 0, // 1
1, 0, 1, 1, 1, 0, 1, // 2
1, 0, 1, 1, 0, 1, 1, // 3
0, 1, 1, 1, 0, 1, 0, // 4
1, 1, 0, 1, 0, 1, 1, // 5
1, 1, 0, 1, 1, 1, 1, // 6
1, 0, 1, 0, 0, 1, 0, // 7
1, 1, 1, 1, 1, 1, 1, // 8
1, 1, 1, 1, 0, 1, 1 } ; // 9
static POINT ptSegment [7][6] = {
7, 6, 11, 2, 31, 2, 35, 6, 31, 10, 11, 10,
6, 7, 10, 11, 10, 31, 6, 35, 2, 31, 2, 11,
36, 7, 40, 11, 40, 31, 36, 35, 32, 31, 32, 11,
7, 36, 11, 32, 31, 32, 35, 36, 31, 40, 11, 40,
6, 37, 10, 41, 10, 61, 6, 65, 2, 61, 2, 41,
36, 37, 40, 41, 40, 61, 36, 65, 32, 61, 32, 41,
7, 66, 11, 62, 31, 62, 35, 66, 31, 70, 11, 70 } ;
int iSeg ;
for (iSeg = 0 ; iSeg < 7 ; iSeg++)
if (fSevenSegment [iNumber][iSeg])
Polygon (hdc, ptSegment [iSeg], 6) ;
} void DisplayTwoDigits (HDC hdc, int iNumber, BOOL fSuppress)
{
if (!fSuppress || (iNumber / 10 != 0))
DisplayDigit (hdc, iNumber / 10) ; OffsetWindowOrgEx (hdc, -42, 0, NULL) ;
DisplayDigit (hdc, iNumber % 10) ;
OffsetWindowOrgEx (hdc, -42, 0, NULL) ;
} void DisplayColon (HDC hdc)
{
POINT ptColon [2][4] = { 2, 21, 6, 17, 10, 21, 6, 25,
2, 51, 6, 47, 10, 51, 6, 55 } ; Polygon (hdc, ptColon [0], 4) ;
Polygon (hdc, ptColon [1], 4) ; OffsetWindowOrgEx (hdc, -12, 0, NULL) ;
} void DisplayTime (HDC hdc, BOOL f24Hour, BOOL fSuppress)
{
SYSTEMTIME st ; GetLocalTime (&st) ; if (f24Hour)
DisplayTwoDigits (hdc, st.wHour, fSuppress) ;
else
DisplayTwoDigits (hdc, (st.wHour %= 12) ? st.wHour : 12, fSuppress) ; DisplayColon (hdc) ;
DisplayTwoDigits (hdc, st.wMinute, FALSE) ;
DisplayColon (hdc) ;
DisplayTwoDigits (hdc, st.wSecond, FALSE) ;
} LRESULT CALLBACK WndProc2 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static BOOL f24Hour, fSuppress ;
static HBRUSH hBrushRed ;
static int cxClient, cyClient ;
HDC hdc ;
PAINTSTRUCT ps ;
TCHAR szBuffer [2] ;
switch (message)
{
case WM_CREATE:
hBrushRed = CreateSolidBrush (RGB (255, 0, 0)) ;
SetTimer (hwnd, ID_TIMER, 1000, NULL) ; // fall through case WM_SETTINGCHANGE:
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITIME, szBuffer, 2) ;
f24Hour = (szBuffer[0] == '1') ; GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITLZERO, szBuffer, 2) ;
fSuppress = (szBuffer[0] == '0') ; InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ; case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ; case WM_TIMER:
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ; case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ; SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, 276, 72, NULL) ;
SetViewportExtEx (hdc, cxClient, cyClient, NULL) ; SetWindowOrgEx (hdc, 138, 36, NULL) ;
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ; SelectObject (hdc, GetStockObject (NULL_PEN)) ;
SelectObject (hdc, hBrushRed) ; DisplayTime (hdc, f24Hour, fSuppress) ; EndPaint (hwnd, &ps) ;
return 0 ; case WM_DESTROY:
KillTimer (hwnd, ID_TIMER) ;
DeleteObject (hBrushRed) ;
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
这个是
#include "Draw_sdk.h"
#define ID_TIMER 1
HWND hwnd0=0;
HINSTANCE hInstance0=0 ;
int nCmdShow0=0;
static TCHAR szAppName[] = TEXT ("DigClock") ;
LRESULT CALLBACK WndProc2 (HWND, UINT, WPARAM, LPARAM) ; #define MAX_LOADSTRING 100 // 全局变量:
HINSTANCE hInst; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名 // 此代码模块中包含的函数的前向声明:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); //自己的函数
LRESULT CALLBACK SetColor(HWND, UINT, WPARAM, LPARAM);
BOOL RealDraw(HWND hWnd, int ROP2, int x, int y); //保存设置的一些全局变量
#define DRAW_LINE 1
#define DRAW_CIRCLE 2
#define DRAW_RECT 3
#define PEN 4
DWORD g_Color = RGB(255,0,0);//颜色,初值为红
DWORD g_Draw = DRAW_LINE; //画笔,默认为直线
int g_x=0,g_y=0; //鼠标左键按下时的坐标
int last_x=0,last_y=0; //前一次鼠标移动后,坐标
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
hInstance0=hInstance;
nCmdShow0=nCmdShow;
WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc2 ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("Program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
// TODO: 在此放置代码。
MSG msg;
HACCEL hAccelTable; // 初始化全局字符串
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_DRAW_SDK, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance); // 执行应用程序初始化:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
} hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_DRAW_SDK); // 主消息循环:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
} return (int) msg.wParam;
} //
// 函数: MyRegisterClass()
//
// 目的: 注册窗口类。
//
// 注释:
//
// 仅当希望在已添加到 Windows 95 的
// “RegisterClassEx”函数之前此代码与 Win32 系统兼容时,
// 才需要此函数及其用法。调用此函数
// 十分重要,这样应用程序就可以获得关联的
// “格式正确的”小图标。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_DRAW_SDK);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCTSTR)IDC_DRAW_SDK;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx(&wcex);
} //
// 函数: InitInstance(HANDLE, int)
//
// 目的: 保存实例句柄并创建主窗口
//
// 注释:
//
// 在此函数中,我们在全局变量中保存实例句柄并
// 创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd; hInst = hInstance; // 将实例句柄存储在全局变量中 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd)
{
return FALSE;
} ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd); return TRUE;
} void GetLargestDisplayMode (int * pcxBitmap, int * pcyBitmap)
{
DEVMODE devmode ;
int iModeNum = 0 ; * pcxBitmap = * pcyBitmap = 0 ; ZeroMemory (&devmode, sizeof (DEVMODE)) ;
devmode.dmSize = sizeof (DEVMODE) ;
while (EnumDisplaySettings (NULL, iModeNum++, &devmode))
{
* pcxBitmap = max (* pcxBitmap, (int) devmode.dmPelsWidth) ;
* pcyBitmap = max (* pcyBitmap, (int) devmode.dmPelsHeight) ;
}
} //
// 函数: WndProc(HWND, unsigned, WORD, LONG)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int idColor [5] = { WHITE_BRUSH, LTGRAY_BRUSH, GRAY_BRUSH,
DKGRAY_BRUSH, BLACK_BRUSH } ;
static int iSelection = IDM_BKGND_WHITE ;
HMENU hMenu ;
int wmId, wmEvent, color;
PAINTSTRUCT ps;
POINT point;
HWND hwnd ; GetCursorPos(&point);
ScreenToClient(hWnd, &point); switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
//处理菜单被选中状态
switch(wmId)
{
case ID_COLOR_RED:
case ID_COLOR_GREEN:
case ID_COLOR_BLUE:
case ID_COLOR_X:
//当某项被选择,先置空所有项,然后选中当前项
CheckMenuItem(GetMenu(hWnd), ID_COLOR_RED, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), ID_COLOR_GREEN, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), ID_COLOR_BLUE, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), ID_COLOR_X, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), wmId, MF_CHECKED);
break;
case ID_LINE:
case ID_CIRCLE:
case ID_RECT:
case ID_PEN:
//同上
CheckMenuItem(GetMenu(hWnd), ID_LINE, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), ID_CIRCLE, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), ID_RECT, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), ID_PEN, MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd), wmId, MF_CHECKED);
break;
}
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
case ID_CLEAR:
//清除,也即刷新一遍窗口
RECT rect;
GetClientRect(hWnd, &rect);
InvalidateRect(hWnd, &rect, 1);
PostMessage(hWnd, WM_PAINT, NULL, NULL);
break;
case ID_COLOR_RED: g_Color = RGB(255,0,0); break; //红
case ID_COLOR_GREEN: g_Color = RGB(0,255,0); break; //绿
case ID_COLOR_BLUE: g_Color = RGB(0,0,255); break; //蓝
case ID_COLOR_X:
DialogBox(hInst, (LPCTSTR)IDD_XCOLOR, hWnd, (DLGPROC)SetColor); //弹出自定义颜色对话框
break;
case IDM_BKGND_WHITE: // Note: Logic below
case IDM_BKGND_LTGRAY: // assumes that IDM_WHITE
case IDM_BKGND_GRAY: // through IDM_BLACK are
case IDM_BKGND_DKGRAY: // consecutive numbers in
case IDM_BKGND_BLACK: // the order shown here.
CheckMenuItem (hMenu, iSelection, MF_UNCHECKED) ;
iSelection = LOWORD (wParam) ;
CheckMenuItem (hMenu, iSelection, MF_CHECKED) ;
color = LOWORD (wParam) - IDM_BKGND_WHITE;
SetClassLong (hWnd, GCL_HBRBACKGROUND, (LONG)
GetStockObject
(idColor [color])) ;
InvalidateRect (hWnd, NULL, TRUE) ;
return 0 ;
case ID_LINE: g_Draw = DRAW_LINE; break; //直线
case ID_CIRCLE: g_Draw = DRAW_CIRCLE; break; //圆
case ID_RECT: g_Draw = DRAW_RECT; break; //矩形
case ID_PEN: g_Draw = PEN; break; //自由画笔
case ID_DigClock:
hwnd0 = CreateWindow (szAppName, TEXT ("Digital Clock"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance0, NULL) ; ShowWindow (hwnd0, nCmdShow0) ;
UpdateWindow (hwnd0) ;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_LBUTTONDOWN:
{
g_x = point.x; //保存当前坐标
g_y = point.y;
last_x = 0; //清空前一个坐标
last_y = 0;
}
break;
case WM_LBUTTONUP:
{
if (last_x || last_y)
RealDraw(hWnd, R2_NOT, last_x, last_y); //如果前一坐标不为空,则反色清掉前一线
RealDraw(hWnd, R2_COPYPEN, point.x, point.y); //真正画完的图
}
break;
case WM_MOUSEMOVE:
if (wParam == MK_LBUTTON) //左键按下
{
if (g_Draw != PEN)
{
if (last_x || last_y)
RealDraw(hWnd, R2_NOT, last_x, last_y); //不为自由画笔时,实现橡皮筋线
RealDraw(hWnd, R2_NOT, point.x, point.y);
}
else
{
//自由画笔,其实就是记录所有鼠标位置,与前一点之间连线
HDC hdc = GetDC(hWnd);
HPEN hNewPen = CreatePen(PS_SOLID, 1, g_Color);
SelectObject(hdc, (HGDIOBJ)hNewPen); //画笔颜色
MoveToEx(hdc, last_x, last_y, NULL);
if (last_x || last_y)
LineTo(hdc, point.x, point.y);
DeleteObject((HGDIOBJ)hNewPen);
ReleaseDC(hWnd, hdc);
}
last_x = point.x; //记录鼠标当前位置
last_y = point.y;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
} // “关于”框的消息处理程序。
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
return TRUE; case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
} // 设置自定义颜色对话框的消息处理程序。
LRESULT CALLBACK SetColor(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
static int red=0, green=0, blue=0;
switch (message)
{
case WM_INITDIALOG:
//设三原色的初值
SetDlgItemInt(hDlg, IDC_RED, red, 1);
SetDlgItemInt(hDlg, IDC_GREEN, green, 1);
SetDlgItemInt(hDlg, IDC_BLUE, blue, 1);
return TRUE; case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
red = GetDlgItemInt(hDlg, IDC_RED, NULL, 1);
green = GetDlgItemInt(hDlg, IDC_GREEN, NULL, 1);
blue = GetDlgItemInt(hDlg, IDC_BLUE, NULL, 1);
if ( red < 0 || red > 255 ||
green < 0 || green > 255 ||
blue < 0 || blue > 255)
{
MessageBox(NULL, "颜色值只能是0~255之间!", "出错", 0); //错误处理
return FALSE;
} g_Color =RGB(red, green, blue); //直接保存颜色值 EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
break;
}
return FALSE;
}
BOOL RealDraw(HWND hWnd, int ROP2, int x, int y)
{
HDC hdc;
POINT point; GetCursorPos(&point); //得到鼠标屏幕坐标
ScreenToClient(hWnd, &point); //转成窗口坐标 hdc = GetDC(hWnd); SetROP2(hdc, ROP2); //实现橡皮筋线
//启用新画笔,实线
HPEN hNewPen = CreatePen(PS_SOLID, 1, g_Color);
SelectObject(hdc, (HGDIOBJ)hNewPen); //画刷,设为空
HGDIOBJ hStockobj = GetStockObject(NULL_BRUSH);
SelectObject(hdc, hStockobj); switch(g_Draw)
{
case DRAW_LINE:
MoveToEx(hdc, g_x, g_y, NULL);//直线
LineTo(hdc, x, y);
break;
case DRAW_RECT:
Rectangle(hdc, g_x, g_y, x, y);//矩形
break;
case DRAW_CIRCLE:
Ellipse(hdc, g_x, g_y, x, y);//圆
break;
default:
break;
} DeleteObject(hNewPen);
DeleteObject(hStockobj);
ReleaseDC(hWnd, hdc); return TRUE;
} void DisplayDigit (HDC hdc, int iNumber)
{
static BOOL fSevenSegment [10][7] = {
1, 1, 1, 0, 1, 1, 1, // 0
0, 0, 1, 0, 0, 1, 0, // 1
1, 0, 1, 1, 1, 0, 1, // 2
1, 0, 1, 1, 0, 1, 1, // 3
0, 1, 1, 1, 0, 1, 0, // 4
1, 1, 0, 1, 0, 1, 1, // 5
1, 1, 0, 1, 1, 1, 1, // 6
1, 0, 1, 0, 0, 1, 0, // 7
1, 1, 1, 1, 1, 1, 1, // 8
1, 1, 1, 1, 0, 1, 1 } ; // 9
static POINT ptSegment [7][6] = {
7, 6, 11, 2, 31, 2, 35, 6, 31, 10, 11, 10,
6, 7, 10, 11, 10, 31, 6, 35, 2, 31, 2, 11,
36, 7, 40, 11, 40, 31, 36, 35, 32, 31, 32, 11,
7, 36, 11, 32, 31, 32, 35, 36, 31, 40, 11, 40,
6, 37, 10, 41, 10, 61, 6, 65, 2, 61, 2, 41,
36, 37, 40, 41, 40, 61, 36, 65, 32, 61, 32, 41,
7, 66, 11, 62, 31, 62, 35, 66, 31, 70, 11, 70 } ;
int iSeg ;
for (iSeg = 0 ; iSeg < 7 ; iSeg++)
if (fSevenSegment [iNumber][iSeg])
Polygon (hdc, ptSegment [iSeg], 6) ;
} void DisplayTwoDigits (HDC hdc, int iNumber, BOOL fSuppress)
{
if (!fSuppress || (iNumber / 10 != 0))
DisplayDigit (hdc, iNumber / 10) ; OffsetWindowOrgEx (hdc, -42, 0, NULL) ;
DisplayDigit (hdc, iNumber % 10) ;
OffsetWindowOrgEx (hdc, -42, 0, NULL) ;
} void DisplayColon (HDC hdc)
{
POINT ptColon [2][4] = { 2, 21, 6, 17, 10, 21, 6, 25,
2, 51, 6, 47, 10, 51, 6, 55 } ; Polygon (hdc, ptColon [0], 4) ;
Polygon (hdc, ptColon [1], 4) ; OffsetWindowOrgEx (hdc, -12, 0, NULL) ;
} void DisplayTime (HDC hdc, BOOL f24Hour, BOOL fSuppress)
{
SYSTEMTIME st ; GetLocalTime (&st) ; if (f24Hour)
DisplayTwoDigits (hdc, st.wHour, fSuppress) ;
else
DisplayTwoDigits (hdc, (st.wHour %= 12) ? st.wHour : 12, fSuppress) ; DisplayColon (hdc) ;
DisplayTwoDigits (hdc, st.wMinute, FALSE) ;
DisplayColon (hdc) ;
DisplayTwoDigits (hdc, st.wSecond, FALSE) ;
} LRESULT CALLBACK WndProc2 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static BOOL f24Hour, fSuppress ;
static HBRUSH hBrushRed ;
static int cxClient, cyClient ;
HDC hdc ;
PAINTSTRUCT ps ;
TCHAR szBuffer [2] ;
switch (message)
{
case WM_CREATE:
hBrushRed = CreateSolidBrush (RGB (255, 0, 0)) ;
SetTimer (hwnd, ID_TIMER, 1000, NULL) ; // fall through case WM_SETTINGCHANGE:
GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITIME, szBuffer, 2) ;
f24Hour = (szBuffer[0] == '1') ; GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITLZERO, szBuffer, 2) ;
fSuppress = (szBuffer[0] == '0') ; InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ; case WM_SIZE:
cxClient = LOWORD (lParam) ;
cyClient = HIWORD (lParam) ;
return 0 ; case WM_TIMER:
InvalidateRect (hwnd, NULL, TRUE) ;
return 0 ; case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ; SetMapMode (hdc, MM_ISOTROPIC) ;
SetWindowExtEx (hdc, 276, 72, NULL) ;
SetViewportExtEx (hdc, cxClient, cyClient, NULL) ; SetWindowOrgEx (hdc, 138, 36, NULL) ;
SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ; SelectObject (hdc, GetStockObject (NULL_PEN)) ;
SelectObject (hdc, hBrushRed) ; DisplayTime (hdc, f24Hour, fSuppress) ; EndPaint (hwnd, &ps) ;
return 0 ; case WM_DESTROY:
KillTimer (hwnd, ID_TIMER) ;
DeleteObject (hBrushRed) ;
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
这个是