#include<graphics.h>
#include<stdio.h>
//#include <iostream>
//#include <cstdio>
using namespace std;
int myLine = 45;
bool _mquit = true;
SOCKET sockConn = -1;//先给他一个值,让他判断accept函数是否正确执行
//如何把TCHAR转化为char
TCHAR _inputIP[24] = { 0 };//外部输入的IP地址
/*
这个函数主要用在框架结构描绘
参数int width,尽量取窗口最大值(显示聊天内容时,文字会自动折行)
参数int height尽量取窗口最大值(显示聊天内容时,文字会自动折行)
/
void myTextOut(LPCTSTR pstr, int ltx, int lty, int width, int height)
{
RECT rect = { 0 };
rect.left = ltx;
rect.top = lty;
rect.right = ltx + width;
rect.bottom = lty + height;
// 设置输出效果为抗锯齿 (VC6 / VC2008 / VC2010 / VC2012)
LOGFONT f;
gettextstyle(&f); // 获取当前字体设置
f.lfHeight = 12; // 设置字体高度为 48
_tcscpy_s(f.lfFaceName, _T("黑体")); // 设置字体为“黑体”(高版本 VC 推荐使用 _tcscpy_s 函数)
f.lfQuality = ANTIALIASED_QUALITY; // 设置输出效果为抗锯齿
settextstyle(&f); // 设置字体样式
//outtextxy(0, 50, _T("抗锯齿效果"));
TCHAR s[1024];
settextcolor(BLACK);
_stprintf_s(s, pstr); // 高版本 VC 推荐使用 _stprintf_s 函数
drawtext(s, &rect, DT_LEFT | DT_WORDBREAK);
}
/
处理网络数据显示在窗口时用这个函数(因为聊天内容的文字是char类型)
/
void CharTextOut(char strChar, int ltx, int lty, int rbx, int rby)
{
//先设字体,因为后面要用到字体的高度和宽度
LOGFONT f;
gettextstyle(&f); // 获取当前字体设置
f.lfHeight = 12; // 设置字体高度为 48
_tcscpy_s(f.lfFaceName, _T("黑体")); // 设置字体为“黑体”(高版本 VC 推荐使用 _tcscpy_s 函数)
f.lfQuality = ANTIALIASED_QUALITY; // 设置输出效果为抗锯齿
settextstyle(&f); // 设置字体样式
//sizeof(strChar);//strChar的长度
//TCHAR myTchar[MAX_PATH] ;
//TCHAR myTchar[sizeof(strChar)] ;//先定义一个TCHAR数据
//char 转 TCHAR
//memset(myTchar, 0, sizeof(strChar));
//mbstowcs(myTchar, strChar, sizeof(strChar));
//char* 转换成 LPCTSTR TCHAR*
int num = MultiByteToWideChar(0, 0, strChar, -1, NULL, 0);
//wchar_t* myTchar = new wchar_t[num];
TCHAR* myTchar = new TCHAR[num];
//TCHAR myTchar[num];
MultiByteToWideChar(0, 0, strChar, -1, myTchar, num);//定义了unicode字符集使用本函数
RECT rect = { 0 };
rect.left = ltx;
rect.top = lty;
rect.right = rbx;
rect.bottom = rby;
// 设置输出效果为抗锯齿 (VC6 / VC2008 / VC2010 / VC2012)
//outtextxy(0, 50, _T("抗锯齿效果"));
//TCHAR pstr[1024] = {0};
settextcolor(BLACK);
//s = pstr;
//_stprintf_s(s, pstr); // 高版本 VC 推荐使用 _stprintf_s 函数
drawtext(myTchar, &rect, DT_LEFT | DT_WORDBREAK);
delete[]myTchar;
}
void drawButton(LPCTSTR pstr, int ID, int ltx, int lty, int width, int height)
{
//窗口右面的一部分
//setbkcolor(LIGHTGRAY + 150);
//clearrectangle(10 , 0, 18 , 12);
setbkmode(TRANSPARENT);
setlinestyle(PS_SOLID, 1);
settextcolor(RED - 100);
// 设置按钮颜色为灰色
setfillcolor(BROWN);
fillrectangle(ltx, lty, ltx + width, lty + height);//按钮
//rectangle(ltx, lty, ltx + width, lty + height);//按钮
// 设置输出效果为抗锯齿
LOGFONT f;
gettextstyle(&f); // 获取当前字体设置
f.lfHeight = 20; // 设置字体高度为 48
_tcscpy_s(f.lfFaceName, _T("宋体")); // 设置字体为“黑体”(高版本 VC 推荐使用 _tcscpy_s 函数)
//f.lfQuality = ANTIALIASED_QUALITY; // 设置输出效果为抗锯齿
settextstyle(&f); // 设置字体样式
TCHAR s[24];
_stprintf_s(s, pstr); // 高版本 VC 推荐使用 _stprintf_s 函数
outtextxy(ltx + 5, lty + 10, s);
}
void myInital()
{
initgraph(400, 600);
setbkcolor(LIGHTGRAY);
cleardevice();
setlinecolor(BLACK);
setlinestyle(PS_SOLID | PS_ENDCAP_SQUARE, 1);
line(0, 450, 400, 450);
line(0, 570, 400, 570);
rectangle(0, 0, 400, 40);
myTextOut(_T("我要访问的IP地址:"), 5, 15, 110, 35);
myTextOut(_T("联网客户端IP地址:"), 5, 580, 110, 20);
drawButton(_T("发送"), 0, 340, 520, 50, 40);
drawButton(_T("联网"), 1, 340, 0, 50, 40);
drawButton(_T("退出"), 2, 340, 563, 50, 37);
//InitSocket(_mport);
//return mysockSrv;
//如何把TCHAR转化为char
InputBox(_inputIP, 50, _T("请输入对方的IP地址"), _T("输入IP"), _T("192.168.1.106"), 50, 100, true);
myTextOut(_inputIP, 115, 15, 95, 20);
}
void myEnd()
{
closegraph();
}
void changeLine()
{
myLine += 15;
if (myLine >= 440)
{
myLine = 55;
clearrectangle(0, 50, 400, 449);
}
}
void buttonDown(int ID)
{
if (ID == -1)
{
changeLine();
myTextOut(_T("鼠标瞎点啥啊!!!"), 10, myLine, 90, 15);
return;
}
switch (ID)
{
case 0:
{
//发送函数
changeLine();
myTextOut(_T("点击了发送按钮"), 10, myLine, 100, 65);
/*
点击了鼠标就要发送消息
*/
}
break;
case 1:
{
//联网函数(accept函数已经在主循环里调用了,所以才有下面的语句)
changeLine();
myTextOut(_T("点击了联网按钮"), 10, myLine, 100, 85);
}
break;
case 2:
{
//如何把TCHAR转化为char
InputBox(_inputIP, 50, _T("请输入对方的IP地址"), _T("输入IP"), _T("192.168.1.101"), 50, 100, true);
// 将用户输入转换为数字
//int r;
//sscanf(tcr, "%d", &r);
//此时tcr已经有数据了
changeLine();
myTextOut(_inputIP, 10, myLine, 100, 65);
}
break;
case 3:
{
changeLine();
myTextOut(_T("按下两次回车键,确认退出!"), 10, myLine, 150, 85);
_mquit = false;
system("pause");
}
break;
default:
break;
}
}
int getButtonId(int x, int y)
{
int IdNum = -1;
if (x > 340 && x < 390 && y>520 && y < 560)
{
IdNum = 0;
}
if (x > 340 && x < 390 && y>0 && y < 40)
{
IdNum = 1;
}
if (x > 100 && x < 340 && y>0 && y < 40)
{
IdNum = 2;
}
if (x > 340 && x < 390 && y>563 && y < 600)
IdNum = 3;
return IdNum;
}
int main()
{
myInital();
MOUSEMSG msg;
int btnNum = 10;
bool isok = true;
bool shurukuang = false;//判断输入框是否激活
while (isok)
{
while (shurukuang)
{
shuru:char talk[MAX_PATH]; //定义字符串
//此处键盘输入中文字符是不可以的,可以输入英文字符并且显示在窗口界面
gets_s(talk, MAX_PATH);
changeLine();
CharTextOut(talk, 0, myLine, 400, 450);//把文字显示在窗口界面上
shurukuang = false;//输入一次以后关闭输入循环
break;
//下面的代码可以正常执行
//sprintf_s(talk, "我爱你,我爱死你了,我恨死你了!!!!!!!");
//changeLine();
//CharTextOut(talk, 0, myLine, 400, 450);//先显示后发送
//break;
}
msg = GetMouseMsg();
switch (msg.uMsg)
{
case WM_LBUTTONDOWN:
{
btnNum = getButtonId(msg.x, msg.y);
}
break;
case WM_LBUTTONUP:
{
buttonDown(btnNum);
if (btnNum == 0)
{
changeLine();
myTextOut(_T("现在可以输入文字了!!!"), 10, myLine, 150, 15);
shurukuang = true;//打开输入文字的while循环开关
goto shuru; //跳转到输入文字的while循环处
}
if (btnNum == 3)//退出
{
isok = false;
}
}
break;
default:
break;
}
}
myEnd();
system("pause");
return 0;
}