📄 recvdlg.cpp
字号:
case MENU_SAVEPOS:
case MENU_SAVESIZE:
case MENU_NORMALSIZE:
case MENU_EDITFONT: case MENU_HEADFONT:
case MENU_DEFAULTFONT:
return EvCommand(0, uCmdType, 0);
}
return FALSE;
}
/*
User掕媊 Event CallBack
*/
BOOL TRecvDlg::EventUser(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_TCPEVENT:
TcpEvent(wParam, lParam);
return TRUE;
case WM_RECVDLG_FILEBUTTON:
SetTransferButtonText();
return TRUE;
}
return FALSE;
}
/*
WM_TIMER event call back
憲怣妋擣/嵞憲梡
*/
BOOL TRecvDlg::EvTimer(WPARAM _timerID, TIMERPROC proc)
{
if (retryCnt++ < cfg->RetryMax * 2)
{
msgMng->UdpSend(msg.hostSub.addr, msg.hostSub.portNo, readMsgBuf);
return TRUE;
}
::KillTimer(hWnd, IPMSG_RECV_TIMER);
if (timerID == 0) // 嵞擖傛偗
return FALSE;
timerID = 0;
if (::IsWindowVisible(hWnd) == FALSE)
::PostMessage(GetMainWnd(), WM_RECVDLG_EXIT, 0, (LPARAM)this);
return TRUE;
}
BOOL TRecvDlg::EvSize(UINT fwSizeType, WORD nWidth, WORD nHeight)
{
if (fwSizeType != SIZE_RESTORED && fwSizeType != SIZE_MAXIMIZED)
return FALSE;
GetWindowRect(&rect);
int xdiff = (rect.right - rect.left) - (orgRect.right - orgRect.left);
int ydiff = (rect.bottom - rect.top) - (orgRect.bottom - orgRect.top);
HDWP hdwp = ::BeginDeferWindowPos(max_recvitem); // MAX item number
WINPOS *wpos;
BOOL isFileBtn = IsWindowEnabled(GetDlgItem(FILE_BUTTON));
UINT dwFlg = (IsNewShell() ? SWP_SHOWWINDOW : SWP_NOREDRAW) | SWP_NOZORDER;
UINT dwHideFlg = SWP_HIDEWINDOW | SWP_NOZORDER;
if (hdwp == NULL)
return FALSE;
// 僒僀僘偑彫偝偔側傞応崌偺挷惍抣偼丄Try and Error(^^;
wpos = &item[title_item];
if ((hdwp = ::DeferWindowPos(hdwp, GetDlgItem(RECV_TITLE), NULL, wpos->x, wpos->y, wpos->cx + xdiff, wpos->cy, dwFlg)) == NULL)
return FALSE;
wpos = &item[head_item];
if ((hdwp = ::DeferWindowPos(hdwp, GetDlgItem(RECV_HEAD), NULL, wpos->x, wpos->y, wpos->cx + xdiff, wpos->cy, dwFlg)) == NULL)
return FALSE;
wpos = &item[head2_item];
if ((hdwp = ::DeferWindowPos(hdwp, GetDlgItem(RECV_HEAD2), NULL, wpos->x, wpos->y, wpos->cx + xdiff, wpos->cy, dwFlg)) == NULL)
return FALSE;
wpos = &item[file_item];
if ((hdwp = ::DeferWindowPos(hdwp, GetDlgItem(FILE_BUTTON), NULL, wpos->x, wpos->y, wpos->cx + xdiff, wpos->cy, (isFileBtn && openFlg) ? dwFlg : dwHideFlg)) == NULL)
return FALSE;
wpos = &item[open_item];
if ((hdwp = ::DeferWindowPos(hdwp, GetDlgItem(OPEN_BUTTON), NULL, wpos->x, wpos->y, wpos->cx + xdiff, wpos->cy + ydiff, openFlg ? dwHideFlg : dwFlg)) == NULL)
return FALSE;
wpos = &item[edit_item];
if ((hdwp = ::DeferWindowPos(hdwp, GetDlgItem(RECV_EDIT), NULL, wpos->x, (isFileBtn ? wpos->y : item[file_item].y), wpos->cx + xdiff, wpos->cy + ydiff + (isFileBtn ? 0 : wpos->y - item[file_item].y), openFlg ? dwFlg : dwHideFlg)) == NULL)
return FALSE;
wpos = &item[ok_item];
if ((hdwp = ::DeferWindowPos(hdwp, GetDlgItem(IDOK), NULL, wpos->x + (xdiff >= 0 ? xdiff / 2 : xdiff * 3 / 4), wpos->y + ydiff, wpos->cx + (xdiff >= 0 ? 0 : xdiff / 4), wpos->cy, dwFlg)) == NULL)
return FALSE;
wpos = &item[cancel_item];
if ((hdwp = ::DeferWindowPos(hdwp, GetDlgItem(IDCANCEL), NULL, wpos->x + (xdiff >= 0 ? xdiff / 2 : xdiff * 3 / 8), wpos->y + ydiff, wpos->cx + (xdiff >= 0 ? 0 : xdiff * 1 / 4), wpos->cy, dwFlg)) == NULL)
return FALSE;
wpos = &item[quote_item];
if ((hdwp = ::DeferWindowPos(hdwp, GetDlgItem(QUOTE_CHECK), NULL, wpos->x + (xdiff >= 0 ? xdiff / 2 : xdiff), wpos->y + ydiff, wpos->cx, wpos->cy, openFlg ? dwFlg : dwHideFlg)) == NULL)
return FALSE;
EndDeferWindowPos(hdwp);
if (!IsNewShell())
::InvalidateRgn(hWnd, NULL, TRUE);
return TRUE;
}
BOOL TRecvDlg::EvGetMinMaxInfo(MINMAXINFO *info)
{
info->ptMinTrackSize.x = (orgRect.right - orgRect.left) * 2 / 3;
info->ptMinTrackSize.y = (orgRect.bottom - orgRect.top) * 2 / 3;
return TRUE;
}
/*
Context Menu event call back
*/
BOOL TRecvDlg::EvContextMenu(HWND childWnd, WORD xPos, WORD yPos)
{
PopupContextMenu();
return TRUE;
}
BOOL TRecvDlg::IsSamePacket(MsgBuf *test_msg)
{
if (test_msg->packetNo == msg.packetNo && test_msg->hostSub.addr == msg.hostSub.addr && test_msg->hostSub.portNo == msg.hostSub.portNo)
return TRUE;
else
return FALSE;
}
void TRecvDlg::SetFont(void)
{
HFONT hDlgFont;
LOGFONT *editFont;
if ((hDlgFont = (HFONT)SendMessage(WM_GETFONT, 0, 0L)) == NULL)
return;
if (::GetObject(hDlgFont, sizeof(LOGFONT), (LPSTR)&orgFont) == NULL)
return;
if (*cfg->RecvHeadFont.lfFaceName == 0) //弶婜僨乕僞僙僢僩
cfg->RecvHeadFont = orgFont;
if (*cfg->RecvEditFont.lfFaceName == 0) //弶婜僨乕僞僙僢僩
cfg->RecvEditFont = orgFont;
if (*cfg->RecvHeadFont.lfFaceName && (hDlgFont = ::CreateFontIndirect(&cfg->RecvHeadFont)) != NULL)
{
SendDlgItemMessage(RECV_HEAD, WM_SETFONT, (UINT)hDlgFont, 0L);
SendDlgItemMessage(RECV_HEAD2, WM_SETFONT, (UINT)hDlgFont, 0L);
if (hHeadFont)
::DeleteObject(hHeadFont);
hHeadFont = hDlgFont;
}
editFont = &cfg->RecvEditFont;
if (editFont->lfFaceName && (hDlgFont = ::CreateFontIndirect(editFont)) != NULL)
{
SendDlgItemMessage(RECV_EDIT, WM_SETFONT, (UINT)hDlgFont, 0L);
if (hEditFont)
::DeleteObject(hEditFont);
hEditFont = hDlgFont;
}
}
void TRecvDlg::SetSize(void)
{
WINDOWPLACEMENT wp;
wp.length = sizeof(wp);
::GetWindowPlacement(GetDlgItem(RECV_TITLE), &wp);
RectToWinPos(&wp.rcNormalPosition, &item[title_item]);
::GetWindowPlacement(GetDlgItem(RECV_HEAD), &wp);
RectToWinPos(&wp.rcNormalPosition, &item[head_item]);
::GetWindowPlacement(GetDlgItem(RECV_HEAD2), &wp);
RectToWinPos(&wp.rcNormalPosition, &item[head2_item]);
::GetWindowPlacement(GetDlgItem(FILE_BUTTON), &wp);
RectToWinPos(&wp.rcNormalPosition, &item[file_item]);
::GetWindowPlacement(GetDlgItem(OPEN_BUTTON), &wp);
RectToWinPos(&wp.rcNormalPosition, &item[open_item]);
::GetWindowPlacement(GetDlgItem(RECV_EDIT), &wp);
RectToWinPos(&wp.rcNormalPosition, &item[edit_item]);
::GetWindowPlacement(GetDlgItem(IDOK), &wp);
RectToWinPos(&wp.rcNormalPosition, &item[ok_item]);
::GetWindowPlacement(GetDlgItem(IDCANCEL), &wp);
RectToWinPos(&wp.rcNormalPosition, &item[cancel_item]);
::GetWindowPlacement(GetDlgItem(QUOTE_CHECK), &wp);
RectToWinPos(&wp.rcNormalPosition, &item[quote_item]);
GetWindowRect(&rect);
orgRect = rect;
int cx = ::GetSystemMetrics(SM_CXFULLSCREEN), cy = ::GetSystemMetrics(SM_CYFULLSCREEN);
int xsize = rect.right - rect.left + cfg->RecvXdiff, ysize = rect.bottom - rect.top + cfg->RecvYdiff;
int x = cfg->RecvXpos, y = cfg->RecvYpos;
if (cfg->RecvSavePos == 0)
{
x = (cx - xsize)/2 + (rand() % (cx/4)) - cx/8;
y = (cy - ysize)/2 + (rand() % (cy/4)) - cy/8;
}
if (x + xsize > cx)
x = cx - xsize;
if (y + ysize > cy)
y = cy - ysize;
MoveWindow((x < 0) ? 0 : x, (y < 0) ? 0 : y, xsize, ysize, TRUE);
}
/*
Menu Event CallBack
*/
BOOL TRecvDlg::EventInitMenu(UINT uMsg, HMENU hMenu, UINT uPos, BOOL fSystemMenu)
{
switch (uMsg)
{
case WM_INITMENU:
{
::ModifyMenu(hMenu, MENU_SAVEPOS, MF_BYCOMMAND|(cfg->RecvSavePos ? MF_CHECKED : 0), MENU_SAVEPOS, SAVEPOS_MSGSTR);
}
return TRUE;
}
return FALSE;
}
/*
Color Event CallBack
*/
BOOL TRecvDlg::EventCtlColor(UINT uMsg, HDC hDcCtl, HWND hWndCtl, HBRUSH *result)
{
#if 0
switch (uMsg) {
case WM_CTLCOLORDLG:
{ static HBRUSH hb; if (hb == NULL) hb = ::CreateSolidBrush(0x222222); *result = hb; }
break;
case WM_CTLCOLOREDIT:
{ static HBRUSH hb; if (hb == NULL) hb = ::CreateSolidBrush(0x222222); *result = hb; }
SetTextColor(hDcCtl, 0xeeeeee);
SetBkColor(hDcCtl, 0x222222);
break;
case WM_CTLCOLORSTATIC:
{ static HBRUSH hb; if (hb == NULL) hb = ::CreateSolidBrush(0x222222); *result = hb; }
SetTextColor(hDcCtl, 0xeeeeee);
SetBkColor(hDcCtl, 0x222222);
break;
}
return TRUE;
#else
return FALSE;
#endif
}
BOOL TRecvDlg::EventButton(UINT uMsg, int nHitTest, POINTS pos)
{
switch (uMsg)
{
case WM_RBUTTONUP:
if (!IsNewShell())
PopupContextMenu();
return TRUE;
}
return FALSE;
}
void TRecvDlg::PopupContextMenu(void)
{
HMENU hMenu = ::CreatePopupMenu();
DWORD pos = GetMessagePos();
SetMainMenu(hMenu);
::TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, LOWORD(pos), HIWORD(pos), 0, hWnd, NULL);
::DestroyMenu(hMenu);
}
void TRecvDlg::SetMainMenu(HMENU hMenu)
{
::AppendMenu(hMenu, MF_POPUP, (UINT)::LoadMenu(TApp::hI, (LPCSTR)RECVFONT_MENU), FONTSET_MSGSTR);
::AppendMenu(hMenu, MF_POPUP, (UINT)::LoadMenu(TApp::hI, (LPCSTR)SIZE_MENU), SIZESET_MSGSTR);
::AppendMenu(hMenu, MF_STRING, MENU_SAVEPOS, SAVEPOS_MSGSTR);
}
/*
憲怣廔椆捠抦
*/
BOOL TRecvDlg::SendFinishNotify(HostSub *hostSub, ULONG packet_no)
{
if (msg.hostSub.addr == hostSub->addr && msg.hostSub.portNo == hostSub->portNo && packet_no == packetNo) {
if (timerID == IPMSG_RECV_TIMER) {
::KillTimer(hWnd, IPMSG_RECV_TIMER);
timerID = 0;
if (::IsWindowVisible(hWnd) == FALSE)
::PostMessage(GetMainWnd(), WM_RECVDLG_EXIT, 0, (LPARAM)this);
}
return TRUE;
}
return FALSE;
}
/*
憲怣拞偼丄Show偺visible傪偼偠偔
*/
void TRecvDlg::Show(int mode)
{
if (timerID == 0 && hWnd)
TWin::Show(mode);
}
BOOL TRecvDlg::TcpEvent(int sd, LPARAM lParam)
{
if (WSAGETSELECTERROR(lParam) || fileObj == NULL || fileObj->conInfo == NULL)
return FALSE;
switch (LOWORD(lParam)) {
case FD_CONNECT: // connect done
StartRecvFile();
break;
case FD_CLOSE:
EndRecvFile();
break;
}
return TRUE;
}
BOOL TRecvDlg::ConnectRecvFile(void)
{
memset(fileObj->conInfo, 0, sizeof(ConnectInfo));
fileObj->conInfo->addr = msg.hostSub.addr;
fileObj->conInfo->port = msg.hostSub.portNo;
if (msgMng->Connect(hWnd, fileObj->conInfo) != TRUE)
return FALSE;
if (fileObj->conInfo->complete)
StartRecvFile();
return TRUE;
}
#define OFFSET 0
BOOL TRecvDlg::StartRecvFile(void)
{
char buf[MAX_PATH], tcpbuf[MAX_BUF];
wsprintf(buf, fileObj->isDir ? "%x:%x:" : "%x:%x:%x:", msg.packetNo, fileObj->fileInfo->Id(), OFFSET);
fileObj->conInfo->complete = TRUE;
msgMng->MakeMsg(tcpbuf, fileObj->isDir ? IPMSG_GETDIRFILES : IPMSG_GETFILEDATA, buf);
msgMng->ConnectDone(hWnd, fileObj->conInfo);
//fileObj->offset = fileObj->woffset = OFFSET;
if (::send(fileObj->conInfo->sd, tcpbuf, strlen(tcpbuf), 0) < (int)strlen(tcpbuf))
return EndRecvFile(), FALSE;
fileObj->conInfo->startTick = fileObj->conInfo->lastTick = ::GetTickCount();
if (fileObj->startTick == 0)
fileObj->startTick = fileObj->conInfo->startTick;
if (fileObj->isDir == FALSE)
fileObj->curFileInfo = *fileObj->fileInfo;
fileObj->recvBuf = new char [cfg->TransMax];
// 0byte file 偩偗偼丄摿椺
if (fileObj->isDir == FALSE && fileObj->curFileInfo.Size() == 0)
{
if (OpenRecvFile())
{
CloseRecvFile(TRUE);
fileObj->status = FS_COMPLETE;
}
else fileObj->status = FS_ERROR;
PostMessage(WM_TCPEVENT, fileObj->conInfo->sd, FD_CLOSE);
return TRUE;
}
DWORD id; // 巊傢偢乮95宯偱 error 偵側傞偺傪杊偖偩偗乯
fileObj->hThread = ~0; // 旝柇側椞堟傪旔偗傞
// thread 撪偱偼 MT 懳墳偑昁梫側 crt 偼巊傢偢
if ((fileObj->hThread = ::CreateThread(NULL, 0, RecvFileThread, this, 0, &id)) == NULL)
{
EndRecvFile();
return FALSE;
}
return TRUE;
}
DWORD WINAPI TRecvDlg::RecvFileThread(void *_recvDlg)
{
TRecvDlg *recvDlg = (TRecvDlg *)_recvDlg;
RecvFileObj *fileObj = recvDlg->fileObj;
fd_set rfd;
timeval tv;
int sock_ret;
BOOL (TRecvDlg::*RecvFileFunc)(void) =
fileObj->isDir ? TRecvDlg::RecvDirFile : TRecvDlg::RecvFile;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -