📄 zmsg.c
字号:
SetTextColor(hDC, i == 4 ? 0x000000FF : 0x00FF0000);
TextOut(hDC, 340, 250, STR_CHECKUPDATE, sizeof(STR_CHECKUPDATE) - 1);
DeleteObject(SelectObject(hDC, hfontOld));
DeleteDC(hDC);
}
break;
// 处理窗口重画消息,画出关于对话框
case WM_PAINT:
hDC = BeginPaint(hWnd, &psPaint);
// 画黑色的横线
MoveToEx(hDC, 60, 175, NULL);
LineTo(hDC, 399, 175);
// 画横线
//hPen = CreatePen(PS_SOLID, 1, 0x00000000);
//hpenOld = (HPEN) SelectObject(hDC, hPen);
//MoveToEx(hDC, 130, 44, NULL);
//LineTo(hDC, 215, 44);
//SelectObject(hDC, hpenOld);
//DeleteObject(hPen);
// 画两组蓝线
hPen = CreatePen(PS_SOLID, 0, 0x00FF9966);
hpenOld = (HPEN) SelectObject(hDC, hPen);
for(i = 1; i< 74; i += 2)
{
MoveToEx(hDC, 0, i, NULL);
LineTo(hDC, 88, i);
}
for(i= 116; i < 132; i += 2)
{
MoveToEx(hDC, 61, i, NULL);
LineTo(hDC, 399, i);
}
SelectObject(hDC, hpenOld);
DeleteObject(hPen);
// 画多出蓝色区域
hBrush = CreateSolidBrush(0x00FF9966);
rtRect.left = 0;
rtRect.top = 75;
rtRect.right = 399;
rtRect.bottom = 111;
FillRect(hDC, &rtRect, hBrush);
DeleteObject(hBrush);
hBrush = CreateSolidBrush(0x00CC3333);
rtRect.top = 111;
rtRect.bottom = 115;
FillRect(hDC, &rtRect, hBrush);
rtRect.left = 60;
rtRect.top = 43;
rtRect.right = 116;
rtRect.bottom = 99;
FillRect(hDC, &rtRect, hBrush);
DeleteObject(hBrush);
rtRect.left = 64;
rtRect.top = 47;
rtRect.right = 112;
rtRect.bottom = 95;
FillRect(hDC, &rtRect, (HBRUSH) GetStockObject(WHITE_BRUSH));
// 画图标
hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ZMSG));
DrawIcon(hDC, 72, 55, hIcon);
DeleteObject(hIcon);
// 画文字信息
SetBkMode(hDC, TRANSPARENT);
hfontOld = (HFONT) SendMessage(hWnd, WM_GETFONT, 0, 0);
GetObject(hfontOld, sizeof(LOGFONT), &lfFont);
hfontOld = (HFONT) SelectObject(hDC, CreateFontIndirect(&lfFont));
TextOut(hDC, 60, 235, STR_APPINFO, sizeof(STR_APPINFO) - 1);
TextOut(hDC, 60, 250, STR_COPYRIGHT, sizeof(STR_COPYRIGHT) - 1);
SetTextColor(hDC, 0x00FF0000);
TextOut(hDC, 60, 185, STR_EMAIL, sizeof(STR_EMAIL) - 1);
TextOut(hDC, 60, 200, STR_HOMEPAGE, sizeof(STR_HOMEPAGE) - 1);
TextOut(hDC, 340, 235, STR_VIEWHELP, sizeof(STR_VIEWHELP) - 1);
TextOut(hDC, 340, 250, STR_CHECKUPDATE, sizeof(STR_CHECKUPDATE) - 1);
SetTextColor(hDC, 0x00BBBBBB);
TextOut(hDC, 60, 140, STR_VERINFO, sizeof(STR_VERINFO) - 1);
TextOut(hDC, 220, 140, STR_BUILDINFO, sizeof(STR_BUILDINFO) - 1);
SetTextColor(hDC, 0x00888888);
if (g_uGateWay == GW_NBUC)
{
p = "宁波联通版";
}
else if (g_uGateWay == GW_ZMSHOP)
{
p = "移动商城版";
}
else
{
p = "浙江移动版";
}
TextOut(hDC, 223, 58, p, lstrlen(p));
DeleteObject(SelectObject(hDC, hfontOld));
SetTextColor(hDC, 0x00000000);
lfFont.lfHeight = 36;
lfFont.lfQuality = ANTIALIASED_QUALITY;
lfFont.lfCharSet = ANSI_CHARSET;
lfFont.lfWeight = 800;
lfFont.lfItalic = TRUE;
lstrcpy(lfFont.lfFaceName, "Arial");
hfontOld = (HFONT) SelectObject(hDC, CreateFontIndirect(&lfFont));
TextOut(hDC, 125, 40, STR_APPNAME, sizeof(STR_APPNAME) - 1);
DeleteObject(SelectObject(hDC, hfontOld));
EndPaint(hWnd, &psPaint);
break;
case WM_CLOSE:
if (g_hCheckUpdate)
{
TerminateThread(g_hCheckUpdate, 0);
CloseHandle(g_hCheckUpdate);
g_hCheckUpdate = NULL;
}
SetClassLong(hWnd, GCL_HCURSOR, (LONG) LoadCursor(NULL, IDC_ARROW));
EndDialog(hWnd, 0);
if (s_bNeedLogIn)
{
GetAccount();
OnCommand(IDC_BUTTON_LOGIN, 0);
}
break;
default:
return FALSE;
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 初始化
void WINAPI OnInitDialog()
{
int i;
RECT rtRect;
HICON hIcon;
char szTemp[256];
// 获取 INI 文件的完整路径
GetModuleFileName(NULL, g_szIniFileName, MAX_PATH);
lstrcpy(&g_szIniFileName[lstrlen(g_szIniFileName) - 4], ".ini");
// 改变窗口位置
rtRect.left = GetPrivateProfileInt(STR_APPNAME, "WindowLeft", 0, g_szIniFileName);
rtRect.right = GetPrivateProfileInt(STR_APPNAME, "WindowRight", 0, g_szIniFileName);
rtRect.top = GetPrivateProfileInt(STR_APPNAME, "WindowTop", 0, g_szIniFileName);
rtRect.bottom = GetPrivateProfileInt(STR_APPNAME, "WindowBottom", 0, g_szIniFileName);
if ((rtRect.right - rtRect.left >= WINDOW_WIDTH) &&
(rtRect.bottom - rtRect.top >= WINDOW_HEIGHT))
MoveWindow(g_hWnd, rtRect.left, rtRect.top, rtRect.right - rtRect.left, rtRect.bottom - rtRect.top, FALSE);
i = GetPrivateProfileInt(STR_APPNAME, "WindowState", SW_SHOWNORMAL, g_szIniFileName);
if ((i > SW_SHOWNORMAL) && (i < SW_MAX))
ShowWindow(g_hWnd, i);
// 设置 ClassXP 风格并显示对话框,这是个隐藏参数
g_bClassXP = GetPrivateProfileInt(STR_APPNAME, "ClassXP", TRUE, g_szIniFileName);
if (g_bClassXP)
{
ShowScrollBar(GetDlgItem(g_hWnd, IDC_EDIT_MESSAGE), SB_BOTH, FALSE);
ClassXP(NULL, TRUE);
}
// 注册热键
RegisterHotKey(g_hWnd, ZMSG_ATOM, MOD_WIN, 'Z');
// 创建状态栏
CreateStatusWindow(WS_CHILD | WS_VISIBLE, "就绪", g_hWnd, IDC_STATUS);
GetClientRect(g_hWnd, &rtRect);
OnSize(SIZE_RESTORED, MAKELONG(rtRect.right, rtRect.bottom));
SendDlgItemMessage(g_hWnd, IDC_STATUS, SB_SETTEXT, 1, (LPARAM) "未登陆");
SendDlgItemMessage(g_hWnd, IDC_STATUS, SB_SETTEXT, 2, (LPARAM) "第 1 条");
SendDlgItemMessage(g_hWnd, IDC_STATUS, SB_SETTEXT, 3, (LPARAM) "0 字");
SetWindowLong(GetDlgItem(g_hWnd, IDC_EDIT_MESSAGE), GWL_USERDATA,
SetWindowLong(GetDlgItem(g_hWnd, IDC_EDIT_MESSAGE), GWL_WNDPROC, (LONG) MessageEditProc));
// 设置图标
hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ZMSG));
SetClassLong(g_hWnd, GCL_HICON, (LONG) hIcon);
DeleteObject(hIcon);
// 获取手机号码列表
for (i = 1; ; i++)
{
wsprintf(szTemp, "Mobile%d", i);
if (GetPrivateProfileString(STR_APPNAME, szTemp, NULL, szTemp, 50, g_szIniFileName) == 0)
break;
SendDlgItemMessage(g_hWnd, IDC_COMBO_MOBILEPHONE, CB_ADDSTRING, 0, (LPARAM) szTemp);
}
SendDlgItemMessage(g_hWnd, IDC_COMBO_MOBILEPHONE, CB_SETCURSEL, 0, 0);
// 获取签名,如果签名和短信内容加起来不超过 70 个字,则添加签名
GetPrivateProfileString(STR_APPNAME, "Sign", "[Powered by ZMSG]", szTemp, sizeof(szTemp), g_szIniFileName);
MultiByteToWideChar(CP_ACP, 0, szTemp, -1, g_wszSign, sizeof(g_wszSign));
g_bSign = GetPrivateProfileInt(STR_APPNAME, "UseSign", TRUE, g_szIniFileName);
// 获取填充字符
GetPrivateProfileString(STR_APPNAME, "FillChar", ".", szTemp, 2, g_szIniFileName);
MultiByteToWideChar(CP_ACP, 0, szTemp, 1, g_wszFillChar, sizeof(g_wszFillChar));
g_bFillChar = GetPrivateProfileInt(STR_APPNAME, "UseFillChar", TRUE, g_szIniFileName);
// 获取代理设置信息
g_wProxyPort = GetPrivateProfileInt(STR_APPNAME, "ProxyPort", 8080, g_szIniFileName);
GetPrivateProfileString(STR_APPNAME, "ProxyAddress", NULL,
g_szProxyAddress, sizeof(g_szProxyAddress), g_szIniFileName);
// 获取账号设置信息
g_uGateWay = GetPrivateProfileInt(STR_APPNAME, "GateWay",0, g_szIniFileName);
// 创建后台登录线程
GetAccount();
OnCommand(IDC_BUTTON_LOGIN, 0);
g_hCheckUpdate = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) CheckUpdate, (LPVOID) g_hWnd, 0, &i);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 程序退出之前保存设置
void WINAPI OnSaveSetting()
{
int i;
int iCount;
char szKey[20];
char szTemp[256];
WINDOWPLACEMENT wpMain;
// 保存是否使用 ClassXP 风格参数
wsprintf(szTemp, "%d", g_bClassXP);
WritePrivateProfileString(STR_APPNAME, "ClassXP", szTemp, g_szIniFileName);
wsprintf(szTemp, "%d", g_uGateWay);
WritePrivateProfileString(STR_APPNAME, "GateWay", szTemp, g_szIniFileName);
// 保存签名
WideCharToMultiByte(CP_ACP, 0, g_wszSign, -1, szTemp, sizeof(szTemp), NULL, NULL);
WritePrivateProfileString(STR_APPNAME, "Sign", szTemp, g_szIniFileName);
wsprintf(szTemp, "%d", g_bSign);
WritePrivateProfileString(STR_APPNAME, "UseSign", szTemp, g_szIniFileName);
WideCharToMultiByte(CP_ACP, 0, g_wszFillChar, -1, szTemp, sizeof(szTemp), NULL, NULL);
WritePrivateProfileString(STR_APPNAME, "FillChar", szTemp, g_szIniFileName);
wsprintf(szTemp, "%d", g_bFillChar);
WritePrivateProfileString(STR_APPNAME, "UseFillChar", szTemp, g_szIniFileName);
// 保存代理设置信息
WritePrivateProfileString(STR_APPNAME, "ProxyAddress", g_szProxyAddress, g_szIniFileName);
wsprintf(szTemp, "%d", g_wProxyPort);
WritePrivateProfileString(STR_APPNAME, "ProxyPort", szTemp, g_szIniFileName);
// 保存窗口位置信息
wpMain.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(g_hWnd, &wpMain);
wsprintf(szTemp, "%d", wpMain.rcNormalPosition.left);
WritePrivateProfileString(STR_APPNAME, "WindowLeft", szTemp, g_szIniFileName);
wsprintf(szTemp, "%d", wpMain.rcNormalPosition.right);
WritePrivateProfileString(STR_APPNAME, "WindowRight", szTemp, g_szIniFileName);
wsprintf(szTemp, "%d", wpMain.rcNormalPosition.top);
WritePrivateProfileString(STR_APPNAME, "WindowTop", szTemp, g_szIniFileName);
wsprintf(szTemp, "%d", wpMain.rcNormalPosition.bottom);
WritePrivateProfileString(STR_APPNAME, "WindowBottom", szTemp, g_szIniFileName);
wsprintf(szTemp, "%d", wpMain.showCmd);
WritePrivateProfileString(STR_APPNAME, "WindowState", szTemp, g_szIniFileName);
// 保存手机号码列表
iCount = (int) SendDlgItemMessage(g_hWnd, IDC_COMBO_MOBILEPHONE, CB_GETCOUNT, 0, 0);
for (i = 0; i < iCount; i++)
{
wsprintf(szKey, "Mobile%d", i + 1);
SendDlgItemMessage(g_hWnd, IDC_COMBO_MOBILEPHONE, CB_GETLBTEXT, i, (LPARAM) szTemp);
WritePrivateProfileString(STR_APPNAME, szKey, szTemp, g_szIniFileName);
}
wsprintf(szKey, "Mobile%d", i + 1);
WritePrivateProfileString(STR_APPNAME, szKey, NULL, g_szIniFileName);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 调整大小
void WINAPI OnSize(WPARAM wParam, LPARAM lParam)
{
int i;
int iWidth;
NOTIFYICONDATA Nid;
int iParts[] = {-1, 55, 55, 55};
if (wParam == SIZE_MINIMIZED)
{
// 添加系统托盘图标,隐藏主窗口
ZeroMemory(&Nid, sizeof(NOTIFYICONDATA));
Nid.cbSize = sizeof(NOTIFYICONDATA);
Nid.hWnd = g_hWnd;
Nid.uID = IDC_NOTIFYICON;
Nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
Nid.uCallbackMessage = WM_ZMSGNOTIFY;
Nid.hIcon = (HICON) GetClassLong(g_hWnd, GCL_HICON);
lstrcpy(Nid.szTip, STR_APPNAME);
Shell_NotifyIcon(NIM_ADD, &Nid);
ShowWindow(g_hWnd, SW_HIDE);
}
else
{
// 调整命令按钮大小及位置
iWidth = (LOWORD(lParam) - 2 * BUTTON_PREFIX - 3 * BUTTON_INTERVAL) / 4;
for (i = 0; i < 4; i++)
{
SetWindowPos(GetDlgItem(g_hWnd, IDC_BUTTON_SEND + i), NULL,
BUTTON_PREFIX + i * (BUTTON_INTERVAL + iWidth), BUTTON_TOP,
iWidth, BUTTON_HEIGHT,
SWP_NOZORDER);
}
// 下面是另外的两种调整命令按钮大小及位置的方法
//for (i = 0; i < 4; i++)
//{
// GetWindowRect(GetDlgItem(g_hWnd, IDC_BUTTON_SEND + i), &rtRect);
// MapWindowPoints(NULL, g_hWnd, (LPPOINT) &rtRect, 2);
// SetWindowPos(GetDlgItem(g_hWnd, IDC_BUTTON_SEND + i), NULL,
// (LOWORD(lParam) - 4 * 75 - 3 * 10) / 2 + i * 75 + i * 10, rtRect.top, 0, 0,
// SWP_NOSIZE | SWP_NOZORDER);
//}
//GetWindowRect(GetDlgItem(g_hWnd, IDC_BUTTON_SEND), &rtRect);
//MapWindowPoints(NULL, g_hWnd, (LPPOINT) &rtRect, 2);
//for (i = 1; i < 4; i++)
//{
// SetWindowPos(GetDlgItem(g_hWnd, IDC_BUTTON_SEND + i), NULL,
// 18 + i * ((LOWORD(lParam) - 2 * 18 - 4 * 75) / 3) + i * 75, rtRect.top, 0, 0,
// SWP_NOSIZE | SWP_NOZORDER);
//}
// 调整命令按围框大小
SetWindowPos(GetDlgItem(g_hWnd, IDC_STATIC_COMMAND), NULL,
0, 0, LOWORD(lParam) - FRAME_XPREFIX, FRAME_HEIGHT,
SWP_NOMOVE | SWP_NOZORDER | SWP_NOREPOSITION);
// 调整内容围框大小
SetWindowPos(GetDlgItem(g_hWnd, IDC_STATIC_CONTENT), NULL,
0, 0, LOWORD(lParam) - FRAME_XPREFIX, HIWORD(lParam) - FRAME_YPREFIX,
SWP_NOMOVE | SWP_NOZORDER | SWP_NOREPOSITION);
// 调整消息编辑框大小
SetWindowPos(GetDlgItem(g_hWnd, IDC_EDIT_MESSAGE), NULL,
0, 0, LOWORD(lParam) - EDIT_XPREFIX, HIWORD(lParam) - EDIT_YPREFIX,
SWP_NOMOVE | SWP_NOZORDER | SWP_NOREPOSITION);
// 调整电话本组合框大小
SetWindowPos(GetDlgItem(g_hWnd, IDC_COMBO_MOBILEPHONE), NULL,
0, 0, LOWORD(lParam) - 115, COMBO_HEIGHT,
SWP_NOMOVE | SWP_NOZORDER | SWP_NOREPOSITION);
// 调整状态兰大小
iParts[0] = LOWORD(lParam) - iParts[1] - iParts[2] - iParts[3];
iParts[1] = LOWORD(lParam) - iParts[2] - iParts[3];
iParts[2] = LOWORD(lParam) - iParts[3];
iParts[3] = -1;
SendDlgItemMessage(g_hWnd, IDC_STATUS, SB_SETPARTS, sizeof(iParts) / sizeof(int), (LPARAM) iParts);
SendDlgItemMessage(g_hWnd, IDC_STATUS, WM_SIZE, wParam, lParam);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 命令消息处理
void WINAPI OnCommand(WPARAM wParam, LPARAM lParam)
{
int i;
int j;
char szTemp[512];
switch (LOWORD(wParam))
{
// 发送短信
case IDC_BUTTON_SEND:
if (g_hSend == NULL)
{
if (SendDlgItemMessage(g_hWnd, IDC_COMBO_MOBILEPHONE, WM_GETTEXT, 50, (LPARAM) szTemp) < 1)
MessageBox(g_hWnd, "手机号码不能不能为空!", STR_APPNAME, MB_ICONSTOP);
else
{
// 把手机号码添加到组合框
if (SendDlgItemMessage(g_hWnd, IDC_COMBO_MOBILEPHONE,
CB_FINDSTRING, -1, (LPARAM) szTemp) == CB_ERR)
SendDlgItemMessage(g_hWnd, IDC_COMBO_MOBILEPHONE, CB_ADDSTRING, 0, (LPARAM) szTemp);
// 查找手机号码
for (i = 0; (i < 50) && (szTemp[i] != '\0'); i++)
{
if ((szTemp[i] == '<') || (szTemp[i] == '{') || (szTemp[i] == '(') ||
(szTemp[i] == '[') || (szTemp[i] == '@') || (szTemp[i] == '-'))
{
i++;
for (j = i; (i + j < 50) && (szTemp[j] != '\0'); j++)
{
if ((szTemp[j] == '>') || (szTemp[j] == '}') || (szTemp[j] == ')') ||
(szTemp[j] == ']') || (szTemp[i] == '@') || (szTemp[i] == '-'))
{
szTemp[j] = '\0';
break;
}
}
break;
}
}
if ((szTemp[i] == '\0') || (i == 50))
i = 0;
lstrcpy(g_szMobile, &szTemp[i]);
// 判断短信内容,创建发送线程
i = (int) SendDlgItemMessage(g_hWnd, IDC_EDIT_MESSAGE, WM_GETTEXTLENGTH, 0, 0);
if (i < 1)
MessageBox(g_hWnd, "没有短信内容!", STR_APPNAME, MB_ICONSTOP);
else
g_hSend = CreateThread(NULL, 0,
(LPTHREAD_START_ROUTINE) SendThread, NULL, 0, &i);
}
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -