最简单的聊天室界面编程
来源:互联网 发布:杨千嬅歌曲评价知乎 编辑:程序博客网 时间:2024/06/05 12:40
///////////////////////////////////////////////////////////////////////////////
// 文件名称:MainFrame.cpp
// 文件功能:创建应用程序界面,实现编辑信息功能、显示信息功能、发送按钮功能
///////////////////////////////////////////////////////////////////////////////
#define _CRT_SECURE_NO_WARNINGS // Visual Studio 中用于取消安全警告提醒
#include <windows.h> // 包含Win32API头文件
#include <time.h> // 包含C语言时间头文件
const int ID_EDIT_RECEIVE = 1; // 接收消息框ID
const int ID_EDIT_SEND = 2; // 发送消息框ID
const int ID_BUTTON_SEND = 3; // 发送按钮ID
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // 主程序消息处理函数
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
PSTR szCmdLine,
int iCmdShow) {
static TCHAR szAppName[] = TEXT("串口助手"); // 应用程序名称
HWND hwnd; // 应用程序视窗
MSG msg; // 应用程序讯息
WNDCLASS wndclass; // 应用程序视窗类别
wndclass.style = CS_HREDRAW | CS_VREDRAW; // 类风格
wndclass.lpfnWndProc = WndProc; // 视窗讯息处理程式
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; // 应用程序类名
RegisterClass(&wndclass); // 注册应用程序类
hwnd = CreateWindow(szAppName, // 应用类名称
szAppName, // 应用程序标题名称
WS_OVERLAPPEDWINDOW, // 应用程序窗口风格
CW_USEDEFAULT, CW_USEDEFAULT, // 应用程序左上角(x,y)位置
613, 547, // 应用程序窗口大小(x,y)
NULL, // 应用程序父窗口句柄
NULL, // 应用程序菜单句柄
hInstance, // 应用程序实例句柄
NULL); // 应用程序创建参数
ShowWindow(hwnd, iCmdShow); // 显示窗口
UpdateWindow(hwnd); // 更新窗口
while (GetMessage(&msg, NULL, 0, 0)) { // 讯息回圈
TranslateMessage(&msg); // 转换消息
DispatchMessage(&msg); // 分发消息
}
return msg.wParam; // 返回程序运行结果
}
////////////////////////////////////////////////////////////////////////////////
// 函数名称:WndProc
// 函数更能:处理主程序的消息
// 输入参数:
// hwnd :父窗口句柄
// message :程序消息
// wParam :程序命令信息
// lParam :程序参数信息
// 输出参数:
// 默认程序处理函数
// 创建时间:范贵川 2017/6/18 09:29:18
////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
static int cxClient, cyClient; // 客户区域大小
static HINSTANCE hInstance; // 应用程序实例
static HWND
hwndReceiveEdit, // 接收区句柄
hwndSendEdit, // 发送区句柄
hwndSendButton; // 发送按钮句柄
PAINTSTRUCT ps; // 画刷结构
RECT rect; // 用来获取矩形结构
HDC hdc, // 主窗口设备句柄
hdc1; // 子窗口设备句柄
HBRUSH hbrush; // 画刷句柄
LPDRAWITEMSTRUCT lpdis; // 绘制项结构指针
time_t tim; // 保存时间变量
struct tm *lt; // tm格式时间结构变量
time(&tim); // 获得机器时间
switch (message) {
case WM_CREATE: // 窗口创建消息
hInstance = ((LPCREATESTRUCT)lParam)->hInstance; // 获取主程序实例句柄
hwndReceiveEdit = // 创建数据接收区子窗口
CreateWindow(TEXT("edit"),
NULL,
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL | ES_MULTILINE |
ES_READONLY,
0, 0, 0, 0,
hwnd, (HMENU)ID_EDIT_RECEIVE,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
hwndSendEdit = // 创建数据发送区子窗口
CreateWindow(TEXT("edit"),
NULL,
WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL | ES_MULTILINE,
0, 0, 0, 0,
hwnd, (HMENU)ID_EDIT_SEND,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
hwndSendButton = // 创建发送按钮子窗口
CreateWindow(TEXT("button"),
TEXT("发送"),
WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
0, 0, 0, 0,
hwnd, (HMENU)ID_BUTTON_SEND,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
return 0;
case WM_SIZE: // 窗口大小改变消息
cxClient = LOWORD(lParam); // 获取应用程序主窗口客户端宽度
cyClient = HIWORD(lParam); // 获取应用程序主窗口客户端高度
MoveWindow(hwndReceiveEdit, 0, 0, cxClient, cyClient - 120, TRUE); // 重新定位数据接收区子窗口大小和位置
MoveWindow(hwndSendEdit, 0, cyClient - 99, cxClient, 70, TRUE); // 重新定位数据发送区子窗口大小和位置
MoveWindow(hwndSendButton, cxClient - 100, cyClient - 25, 50, 20, TRUE);// 重新定位发送按钮子窗口大小和位置
return 0;
case WM_DRAWITEM: // 窗口绘制消息
lpdis = (LPDRAWITEMSTRUCT)lParam; // 获取绘制项结构指针
FillRect(lpdis->hDC, &lpdis->rcItem, // 填充窗口背景
(HBRUSH)GetStockObject(WHITE_BRUSH));
FrameRect(lpdis->hDC, &lpdis->rcItem, // 填充窗口边框
(HBRUSH)GetStockObject(BLACK_BRUSH));
TCHAR text[64]; // 用来存放子控制项文字
GetWindowText(lpdis->hwndItem, text, 63); // 获取子控制项文字
SetTextColor(lpdis->hDC, RGB(0, 0, 0)); // 设置字体颜色
SetBkMode(lpdis->hDC, TRANSPARENT); // 设置字体背景模式
DrawText(lpdis->hDC, text, lstrlen(text), // 绘制文字
&lpdis->rcItem,
DT_CENTER | DT_VCENTER | DT_SINGLELINE);
if (lpdis->itemState & ODS_SELECTED) { // 当子窗口被选中时进行相应的处理
InvertRect(lpdis->hDC, &lpdis->rcItem); // 反转矩形
}
return 0;
case WM_COMMAND: // 命令消息
if (lParam && (LOWORD(wParam) == ID_EDIT_SEND)) { // 发送区域的消息
switch (HIWORD(wParam)) {
case EN_CHANGE:
InvalidateRect(hwnd, NULL, TRUE); // 当发送区域的内容改变时更新
}
break;
}
switch (LOWORD(wParam)) {
case ID_BUTTON_SEND: // 发送按钮命令
int i = GetWindowTextLength(hwndSendEdit); // 获取发送编辑框中的字符长度
i = i + 3 > 35 ? i + 3 : 35; // 选择最大长度
TCHAR *sz = new TCHAR[i]; // 动态分配存储空间
lt = localtime(&tim); // 获取当地时间
wsprintf(sz, L"范贵川:%4d/%d%d/%d%d %d%d:%d%d:%d%d\r\n", // 将时间输出到字符缓冲区
lt->tm_year + 1900,
(lt->tm_mon + 1) / 10, (lt->tm_mon + 1) % 10,
lt->tm_mday / 10, lt->tm_mday % 10,
lt->tm_hour / 10, lt->tm_hour % 10,
lt->tm_min / 10, lt->tm_min % 10,
lt->tm_sec / 10, lt->tm_sec % 10);
SendMessage(hwndReceiveEdit, EM_REPLACESEL, -1, (LPARAM)(sz)); // 将字符串发送到数据接收区显示
GetWindowText(hwndSendEdit, LPWSTR(sz), i); // 获取发送区字符串
i = lstrlen(sz); // 计算字符长度
sz[i] = L'\r'; // 增加换行符
sz[i + 1] = L'\n';
sz[i + 2] = L'\0'; // 增加字符结束符
SendMessage(hwndReceiveEdit, EM_REPLACESEL, -1, (LPARAM)(sz)); // 将字符串发送到接收区显示
delete []sz; // 清除动态存储空间
break;
}
return 0;
case WM_PAINT: // 窗口重绘消息
hdc = BeginPaint(hwnd, &ps);
MoveToEx(hdc, 0, cyClient - 120, NULL); // 绘制发送区和接收区中间的分割线
LineTo(hdc, cxClient, cyClient - 120);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY: // 窗口销毁消息
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
- 最简单的聊天室界面编程
- PHP实现最简单的聊天室应用
- JavaWeb 最简单的聊天室设计
- socket编程:简单的多客户端聊天室
- Windows网络编程-简单的多线程聊天室
- 使用socket.io编程的简单聊天室
- 【聊天室】android 简单的聊天室
- asp.net+jquery+xml实现最简单的聊天室
- 搭建flex + blazeds 最简单的messaging例子:简易聊天室
- Ubuntu下用apache+perl搭建最简单的聊天室
- 用UDP协议实现最简单的“聊天室”功能
- QT编程系列7--一个最简单的实用Qt界面的设计
- UCsocket 编程,简单聊天室实现
- Ubuntu下wxWidgets的CSocket编程,简单聊天室
- Linux socket编程(三) 简单的多线程聊天室
- Linux socket编程(三) 简单的多线程聊天室
- Linux socket编程(三) 简单的多线程聊天室
- 简单的java聊天室
- UNIX网络编程2:套接字编程简介
- 码农从菜鸟到大牛的必须文章
- 如何使用github上传项目
- 1052. 卖个萌 (20)
- 数据挖掘中分类指标AUC
- 最简单的聊天室界面编程
- GO struct 小结
- Spring(五)spring整合jdbc
- Docker Toolbox 使用小技巧-复制粘贴-批量处理-循环语句-dm别名
- linux 扩展swap分区大小
- Android框架之Camera(3)透过Camera服务看Binder进程间通信
- PHP四种基础排序算法--冒泡,直接插入,快速和选择排序
- (2) JDBC建立连接实例
- Karen and Morning