Use screen names and add auto scroll
This commit is contained in:
parent
4b8149fcb6
commit
bd2772ae0e
Binary file not shown.
@ -16,6 +16,7 @@ namespace wc {
|
||||
Chat::Chat(std::wstring address, std::wstring screenname)
|
||||
: m_address(address)
|
||||
, m_screenname(screenname)
|
||||
, m_remoteScreenname(1000, 0)
|
||||
, m_connected(false)
|
||||
, m_connectionError(false)
|
||||
{
|
||||
@ -71,7 +72,14 @@ namespace wc {
|
||||
}
|
||||
|
||||
unsigned long yes = 1;
|
||||
unsigned long no = 0;
|
||||
ioctlsocket(sock, FIONBIO, &no);
|
||||
|
||||
//Send and receive screen names
|
||||
send(sock, reinterpret_cast<const char*>(m_screenname.c_str()), static_cast<int>(m_screenname.size()) * sizeof(wchar_t), NULL);
|
||||
m_remoteScreenname.resize(recv(sock, reinterpret_cast<char*>(m_remoteScreenname.data()), 1000, NULL) / 2);
|
||||
ioctlsocket(sock, FIONBIO, &yes);
|
||||
|
||||
m_connected = true;
|
||||
|
||||
std::wstring recvBuffer(2000, 0);
|
||||
@ -165,14 +173,14 @@ namespace wc {
|
||||
ChatDlgInput* in = reinterpret_cast<ChatDlgInput*>(lParam);
|
||||
chat = in->chatPtr;
|
||||
|
||||
SetWindowText(dlg, std::format(L"remote screenname at {} - WinChat", chat->m_address).c_str());
|
||||
SetWindowText(dlg, std::format(L"{} - WinChat", chat->m_remoteScreenname).c_str());
|
||||
SendMessage(dlg, WM_SETICON, ICON_BIG, reinterpret_cast<LPARAM>(LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_ICONMAIN))));
|
||||
|
||||
SetWindowPos(dlg, nullptr, in->xPos - 50, in->yPos - 50, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
|
||||
|
||||
SendDlgItemMessage(dlg, IDC_EDITCHATINPUT, EM_SETCUEBANNER, TRUE, reinterpret_cast<LPARAM>(L"Message"));
|
||||
|
||||
SetDlgItemText(dlg, IDC_EDITCHATDISPLAY, std::format(L"Connected to remote screenname at {}", chat->m_address).c_str());
|
||||
SetDlgItemText(dlg, IDC_EDITCHATDISPLAY, std::format(L"Connected to {} at {}", chat->m_remoteScreenname, chat->m_address).c_str());
|
||||
|
||||
SetTimer(dlg, IDT_UPDATECHAT, 100, nullptr);
|
||||
|
||||
@ -193,7 +201,7 @@ namespace wc {
|
||||
GetDlgItemText(dlg, IDC_EDITCHATINPUT, buffer.data(), static_cast<int>(buffer.size() + 1));
|
||||
chat->m_sendQueue.push(buffer);
|
||||
|
||||
chat->addMessage(dlg, buffer);
|
||||
chat->addMessage(dlg, std::format(L"{} - {}", chat->m_screenname, buffer).c_str());
|
||||
|
||||
SetDlgItemText(dlg, IDC_EDITCHATINPUT, L"");
|
||||
|
||||
@ -216,7 +224,7 @@ namespace wc {
|
||||
std::wstring remoteStr;
|
||||
while (!chat->m_recvQueue.empty()) {
|
||||
remoteStr = chat->m_recvQueue.pop();
|
||||
chat->addMessage(dlg, remoteStr);
|
||||
chat->addMessage(dlg, std::format(L"{} - {}", chat->m_remoteScreenname, remoteStr).c_str());
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
@ -232,21 +240,20 @@ namespace wc {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void Chat::addMessage(HWND dlg, std::wstring& in) {
|
||||
void Chat::addMessage(HWND dlg, std::wstring in) {
|
||||
SCROLLINFO si = { .cbSize = sizeof(si), .fMask = SIF_POS | SIF_PAGE | SIF_RANGE };
|
||||
GetScrollInfo(GetDlgItem(dlg, IDC_EDITCHATDISPLAY), SB_VERT, &si);
|
||||
bool shouldScroll = static_cast<int>(si.nPage) + si.nPos > si.nMax;
|
||||
|
||||
std::wstring buffer(GetWindowTextLength(GetDlgItem(dlg, IDC_EDITCHATDISPLAY)), 0);
|
||||
GetDlgItemText(dlg, IDC_EDITCHATDISPLAY, buffer.data(), static_cast<int>(buffer.size() + 1));
|
||||
buffer += std::format(L"\r\n{}", in);
|
||||
buffer += std::format(L"\r\n\r\n{}", in);
|
||||
SetDlgItemText(dlg, IDC_EDITCHATDISPLAY, buffer.c_str());
|
||||
|
||||
if (shouldScroll) {
|
||||
SendDlgItemMessage(dlg, IDC_EDITCHATDISPLAY, EM_SETSEL, 0, -1);
|
||||
SendDlgItemMessage(dlg, IDC_EDITCHATDISPLAY, EM_SETSEL, -1, -1);
|
||||
SendDlgItemMessage(dlg, IDC_EDITCHATDISPLAY, EM_SCROLLCARET, 0, 0);
|
||||
}
|
||||
//If scrolled to the bottom before adding the text
|
||||
if (static_cast<int>(si.nPage) + si.nPos > si.nMax)
|
||||
SendDlgItemMessage(dlg, IDC_EDITCHATDISPLAY, EM_LINESCROLL, 0, si.nMax);
|
||||
else
|
||||
SendDlgItemMessage(dlg, IDC_EDITCHATDISPLAY, EM_LINESCROLL, 0, si.nPos);
|
||||
}
|
||||
|
||||
Chat::~Chat() {
|
||||
|
@ -18,10 +18,11 @@ namespace wc {
|
||||
std::wstring getErrorString();
|
||||
static BOOL CALLBACK connDlgProc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||
static BOOL CALLBACK chatDlgProc(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam);
|
||||
void addMessage(HWND dlg, std::wstring& str);
|
||||
void addMessage(HWND dlg, std::wstring str);
|
||||
|
||||
const std::wstring m_address;
|
||||
const std::wstring m_screenname;
|
||||
std::wstring m_remoteScreenname;
|
||||
bool m_connected;
|
||||
bool m_connectionError;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user