#include <windows.h>
#include "resource.h"
// 手型光标的资源定义
#ifndef IDC_HAND
#define IDC_HAND MAKEINTRESOURCE(32649)
#endif
// 全局变量,用于保存默认的Edit、Static窗口过程以便子类化窗口调用
WNDPROC EditProc, StaticProc;
// 浮点数输入框的子类化窗口过程
LRESULT CALLBACK ProcFloat(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
// 不允许数字、小数点、退格之外的任何输入
if (Msg == WM_CHAR && wParam != '.' && (wParam <= '0' || wParam >= '9') && wParam != VK_BACK)
{
// 发出声音表示警告
MessageBeep(MB_OK);
return 0;
}
else
// 如果是其它消息,则调用原有的窗口过程
return CallWindowProc(EditProc, hWnd, Msg, wParam, lParam);
}
// 超级链接的子类化窗口过程
LRESULT CALLBACK ProcLink(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_SETCURSOR:
// 当鼠标移至链接上时,改变光标
SetCursor(LoadCursor(NULL, IDC_HAND));
break;
case WM_LBUTTONDOWN:
// 打开链接
ShellExecute(NULL, "open", "http://home.ncust.edu.cn/~titilima", NULL, NULL, SW_SHOWNORMAL);
break;
default:
// 如果是其它消息,则调用原有的窗口过程
return CallWindowProc(StaticProc, hWnd, Msg, wParam, lParam);
}
return 0;
}
// 主窗口对话框窗口过程
LRESULT CALLBACK ProcMain(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
switch (Msg)
{
case WM_INITDIALOG:
// 进行子类化,保存原窗口过程
EditProc = (WNDPROC)SetWindowLong(GetDlgItem(hDlg, IDC_EDIT), GWL_WNDPROC, (LONG)ProcFloat);
StaticProc = (WNDPROC)SetWindowLong(GetDlgItem(hDlg, IDC_ST_HOMEPAGE), GWL_WNDPROC, (LONG)ProcLink);
break;
case WM_CLOSE:
// 最小化
ShowWindow(hDlg, SW_MINIMIZE);
break;
case WM_COMMAND:
// 退出
if (LOWORD(wParam) == IDC_BTN_EXIT)
EndDialog(hDlg, 0);
break;
case WM_CTLCOLORSTATIC:
// 改变超级链接的颜色
if (GetDlgItem(hDlg, IDC_ST_HOMEPAGE) == (HWND)lParam)
{
// 设置文本颜色
SetTextColor((HDC)wParam, 0xff0000);
// 设置背景模式为透明
SetBkMode((HDC)wParam, TRANSPARENT);
// 返回DC的画刷
return (LRESULT)CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
}
break;
case WM_DESTROY:
// 退出处理
PostQuitMessage(0);
break;
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
// 显示主窗口对话框
DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, (DLGPROC)ProcMain, 0);
return 0;
}