最简单的聊天室界面编程

来源:互联网 发布:杨千嬅歌曲评价知乎 编辑:程序博客网 时间: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);
}

原创粉丝点击