发信人: u_rover(柠檬水)
整理人: wenbobo(2003-08-23 10:59:18), 站内信件
|
int MeasureMenuItem(LPMEASUREITEMSTRUCT m)
{
HDC hDC;
RECT r;
MenuData* md;
if ((md = (MenuData*)m->itemData) == NULL)
return -1;
if ((hDC = GetDC(ghWndMain) == 0) {
ShowErrMsg("GetDC");
return -1;
}
SetRectEmpty(&r);
DrawText(hDC, md->str, -1, &r, DT_CALCRECT | DT_SINGLELINE | DT_VCENTER);
m->itemWidth = r.right + 20;
m->itemHeight = GetSystemMetrics(SM_CYMENU) <= 20? 20: GetSystemMetrics(SM_CYMENU);
ReleaseDC(hDC);
return 1;
}
typedef struct tagDRAWITEMSTRUCT {
UINT CtlType; //0
UINT CtlID; //4
UINT itemID; //8
UINT itemAction; //c
UINT itemState; //10
HWND hwndItem; //14
HDC hDC; //18
RECT rcItem; //1c
DWORD itemData; //2c
} DRAWITEMSTRUCT, NEAR *PDRAWITEMSTRUCT, FAR *LPDRAWITEMSTRUCT;
BOOL CALLBACK DrawMenuImageProc(HDC hdc, LPARAM lData, WPARAM wData, int cx, int cy)
{
ImageList_Draw(lData, wData, hdc, 0, 0, ILD_TRANSPARENT);
return TRUE;
}
BOOL CALLBACK DrawMenuTextProc(HDC hdc, LPARAM lData, WPARAM wData, int cx, int cy)
{
char* str, *ptr;
Rect r;
if ((str = wData) != NULL)
ptr = str + strlen(str) + 1;
else
ptr = NULL;
SetRect(&r, 0, 0, cx, cy);
DrawText(hdc, str, -1, &r, DT_SINGLELINE | DT_VCENTER);
if (ptr)
DrawText(hdc, ptr, -1, &r, DT_SINGLELINE | DT_VCENTER | DT_RIGHT);
return TRUE;
}
int DrawMenuItem(LPARAM lParam)
{
HDC hDC;
RECT rc, Rect, qrc, r;
MenuData* md;
LPDRAWITEMSTRUCT d = (LPDRAWITEMSTRUCT)lParam;
int SavedDC;
char* str;
if ((md = (MenuData*)d->itemData) == NULL)
return -1;
if (md->ImageIndex != -1)
lParam = md->ImageIndex;
else
lParam = d->itemState & ODS_CHECKED? 0 : -1;
CopyRect(&rc, d->rcItem);
Rect.top = rc.top;
qrc.left = rc.left + 2;
qrc.right = qrc.left + 20;
Rect.left = qrc.right + 2;
qrc.top = (rc.bottom - rc.top - 20) / 2 + rc.top;
qrc.bottom = qrc.top + 20;
Rect.right = rc.right - 10;
Rect.bottom = rc.bottom;
CopyRect(&r, &rc);
if (lParam != -1)
r.left = qrc.right;
hDC = d->hDC;
SavedDC = SaveDC(hDC);
SetBkMode(hDC, TRANSPARENT);
FillRect(hDC, &rc, NULL_BRUSH);
if (d->itemState & (ODS_DISABLED | ODS_SELECTED))
FillRect(hDC, &r, DEVICE_DEFAULT_FONT);
// ODS_SELEC
// ODS_SELECTED = 0x0001 ODS_GRAYED = 0x0002 ODS_CHECKED = 0x0008
// NULL_BRUSH = 5 DEFAULT_GUI_FONT = 17
if (ghImageList != 0 && lParam != -1) {
FillRect(hDC, &qrc,
((d->itemState & ODS_CHECKED) == 0 || d->itemState & ODS_SELECTED)?
NULL_BRUSH : DEFAULT_GUI_FONT);
if (d->itemState & ODS_CHECKED)
DrawEdge(hDC, &qrc, BDR_SUNKENOUTER, BF_RECT);
else if ((d->itemState & ODS_SELECTED) != 0 && d->itemState & ODS_GRAYED == 0)
DrawEdge(hDC, &qrc, BDR_RAISEDOUTER, BF_RECT);
InflateRect(&prc, -2, -2);
if (d->itemState & ODS_GRAYED)
DrawState(hDC, WHITE_BRUSH, DrawMenuImageProc, ghImageList, lParam,
qrc.left, qrc.top, qrc.right - qrc.left, qrc.bottom - qrc.top,
DSS_DISABLED);
else
ImageList_Draw(ghImageList, lParam, hDC, qrc.left, qrc.top, ILD_TRANSPARENT);
}
str = md->str;
if ((md = strchr(str, '\t')) != NULL) {
*(char*)md = '\0';
lParam = str;
str = (char*)md + 1;
}
else {
lParam = str;
str = NULL;
}
if ((d->itemState & ODS_SELECTED) == 0 && d->itemState & ODS_GRAYED) {
DrawState(hDC, WHITE_BRUSH, DrawMenuTextProc, lParam,
str == 0? 0 : 1, Rect.left, Rect.top, Rect.right - Rect.left,
Rect.bottom - Rect.top, DSS_DISABLED/*0x0020*/);
}
else {
if ((d->itemState & ODS_SELECTED) == 0)
SetTextColor(hDC, GetSysColor(COLOR_MENUTEXT));
else if ((d->itemState & ODS_GRAYED) == 0)
SetTextColor(hDC, GetSysColor(COLOR_HIGHLIGHTTEXT));
else
SetTextColor(hDC, GetSysColor(COLOR_MENU));
DrawText(hDC, lParam, -1, &Rect, DT_SINGLELINE | DT_VCENTER);
if (str)
DrawText(hDC, str, -1, &Rect, DT_SINGLELINE | DT_VCENTER | DT_RIGHT);
}
if (md) *(char*)md = '\t';
RestoreDC(hDC, SavedDC);
return TRUE;
}
RECT grSize1, grSize2;
LRESULT MainWinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static UINT uTaskBarCreatedMsg = 0;
NMHDR* nmh;
NOTIFYICONDATA nid;
RECT rc, rcRebar, x;
HDWP hDWP;
SYSTEMTIME st;
if (!uTaskBarCreatedMsg)
uTaskBarCreatedMsg = RegisterWindowMessage("TaskbarCreated");
if (uMsg == uTaskBarCreatedMsg)
uMsg = 0x7fe;
switch (uMsg)
{
case WM_NOTIFY:
if (lParam == 0) break;
nmh = (NMHDR*)lParam;
if (nmh->code == TTN_FIRST)
if (SendMessage(ghToolbar, 0x423, 0, 0) == nmh->hwndFrom)
;
break;
case WM_CREATE:
gbTrayIconPresent = FALSE;
ghWndMain = hWnd;
GetConfigFromReg();
GetMostRecentlyURL();
GetLastDir();
GetCategory();
GetLoginInfo();
GetDefaultHttpProxy();
GetBookmark();
ghMenu = LocalizeMenu(ghInstance, MAKEINTRESOURCE(102));
CreateContextMenu(GetSubMenu(ghMenu, 3));
LocaleContextMenu(ghMenu, 1);
SetMenu(hWnd, ghMenu);
ghRebar = CreateRebar(hWnd);
ghToolbar = CreateMyToolbar(ghRebar);
ghWaveBar = CreateWaveBar(ghRebar);
ghAdvWin = CreateAdvWindow(hWnd);
ghStatusbar = CreateStatusbar(hWnd);
ghFolderWin = CreateFolderWin(hWnd);
ghJobList = CreateJobPane(hWnd);
ghBlockWin = CreateBlockWin(hWnd);
ghLogWin = CreateLogWin(hWnd);
ghInfoListWin = CreateInfoWin(hWnd);
ghLinkListWin = CreateLinkWin(hWnd);
ghTabWin = CreateTabWin(hWnd);
ghDropBasketWin = CreateDropBasket();
gpJobDropTarget = CreateDropTarget(ghJobList, hWnd);
gpBasketDropTarget = CreateDropTarget(ghDropBasketWin, hWnd);
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = 0x6b;
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
nid.uCallbackMessage = 0x7ec;
nid.hIcon = LoadIcon(hgInstance, IDI_NETANTS);
sprintf(nid.szTip, "%lu bytes received", gReceivedBytes);
if (!Shell_NofifyIcon(NIM_ADD, &nid)) {
ShowErrMsg("Shell_NotifyIcon(Add)");
return -1;
}
gbTrayIconPresent = TRUE;
SendMessage(ghWaveBar, 0x7f2, gBandWidthScale, 0);
ghThreadHandle = _beginthreadex(NULL, NULL, WorkThread, NULL, NULL, &gThreadID);
if (hHandle == 0) {
ShowErrMsg("_beginthreadex");
return -1;
}
if (!SetTimer(hWnd, 2, 1000, NULL))
ShowErrMsg("SetTimer");
if (!SetTimer(hWnd, 3, 60000, NULL))
ShowErrMsg("SetTimer");
if (!SetTimer(hWnd, 4, gSampleFrequency * 1000, NULL))
ShowErrMsg("SetTimer");
if (!SetTimer(hWnd, 8, 60000, NULL))
ShowErrMsg("SetTimer");
if (!SetTimer(hWnd, 9, 1000, NULL))
ShowErrMsg("SetTimer");
break;
case WM_SIZE:
if (wParam == SIZE_MINIMIZED)
MinimizeMainWindow(hWnd);
else if (var != 0)
var = 0;
GetClientRect(hWnd, &rc);
if (gnWidth == 0)
gnWidth = rc.right / 4;
if (gyTop == 0)
gyTop = rc.bottom / 2;
SetRect(&grSize1, gnWidth, 0, gnWidth + 3, rc.bottom);
SetRect(&grSize2, 0, gyTop, rc.right, nyTop + 3);
if (gbHideToolbar) {
MoveWindow(ghRebar, rc.left, rc.top, rc.right, rc.bottom, TRUE);
GetWindowRect(ghRebar, rcRebar);
rc.top = rcRebar.bottom - rcRebar.top + rc.top + 1;
grSize1.top += rcRebar.bottom - rcRebar.top + 1;
}
if (gbShowStatusBar) {
SendMessage(ghStatusbar, WM_SIZE, 0, 0);
GetWindowRect(ghStatusBar, rcRebar);
grSize1.bottom += rcRebar.top - rcRebar.bottom - 1;
rc.bottom += rcRebar.top - rcRebar.bottom - 1;
}
if (gbShowFolderWindow) {
MoveWindow(ghFolderWindow, rc.left, rc.top, nVSplitPos, rc.bottom - rc.top, TRUE);
rc.left = nVSplitPos + rc.left + 3;
grSize2.left += nVSplitPos + 3;
}
else {
grSize1.left = 0;
grSize1.right = 0;
}
MoveWindow(ghAdvWin, rc.left, rc.top, rc.right - rc.left, 0/* Org 0x42*/, TRUE);
rc.top += 0; /* Org 0x43 */
if (gbShowTaskStatusPane) {
hDWP = BeginDeferWindowPos(5);
SetRect(&x, rc.left, nHSplitPos + 3, rc.right, rc.bottom);
DeferWindowPos(hDWP, ghTabWin, 0, x.left, x.top, x.right - x.left, x.bottom - x.top, SWP_NOZORDER);
SendMessage(ghTabWin, 0x1328, 0, &x);
DeferWindowPos(hDWP, ghLogWin, 0, x.left, x.top, x.right - x.left, x.bottom - x.top, SWP_NOZORDER);
DeferWindowPos(hDWP, ghInfoListWin, 0, x.left, x.top, x.right - x.left, x.bottom - x.top, SWP_NOZORDER);
DeferWindowPos(hDWP, ghLinkListWin, 0, x.left, x.top, x.right - x.left, x.bottom - x.top, SWP_NOZORDER);
EndDeferWindowPos(hDWP);
rc.bottom = nHSplitPos;
}
else {
grSize2.top = 0;
grSize2.bottom = 0;
}
MoveWindow(ghJobList, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE);
break;
case WM_POWERBROADCAST:
if (wParam == PBT_APMQUERYSUSPEND)
return gRunningJobCount > 0? BROADCAST_QUERY_DENY : TRUE;
break;
case WM_TIMER:
switch (wParam)
{
case 2:
Timer2(ghJobList);
break;
case 3:
while (!PostThreadMessage(gThreadID, 0x407, 0, 0))
if (GetLastError() == ERROR_INVALID_THREAD_ID) break;
break;
// updating bandwidth display and received datasize on statusbar
case 4:
Bandwidth = SampledDataSize / gHistoSampleFrequency;
BandwidthScale = gBandwidthScale * 1024;
SendMessage(ghWaveBar, 0x7f1, Bandwidth, 0);
ShowBandwidthOnStatusbar(ghStatusbar, Bandwidth);
if (Bandwidth > BandwidthScale)
Bandwidth = BandwidthScale;
if (Bandwidth) {
if (!SetTimer(hWnd, 13, 200 * (4 - 3 * Bandwidth / BandwidthScale), 0)
ShowErrMsg("SetTimer");
gbBasketTimer = TRUE;
}
else if (gbBasketTimer) {
KillTimer(hWnd, 13);
gbBasketTimer = FALSE;
}
SampledDataSize = 0;
ShowReceivedSizeOnStatusbar(ghStatusbar, gReceivedBytes);
break;
//Schedule timer for scheduled downloading & hangup
case 8:
GetLocalTime(&st);
if (gbScheduleDownload &&
st.wHour == gScheduleDownloadHour && st.wMinute == gScheduleDownloadMinute)
{
SechduleDownload();
}
if (gbScheduleHangup &&
st.wHour == gScheduleDownloadHour && st.wMinute == gScheduleDownloadMinute)
{
SechduleHangup();
if (gbAutoHangup)
Hangup();
}
break;
case 9:
if (gnSpeedMode == 0) {
UpdateBandwidth(-1);
}
else (gnSpeedMode == 1) {
UpdateBandwidth(gnBandwidth);
}
else if (gnSpeedMode == 2) {
}
break;
case 12:
break;
case 13: // Basket timer
break;
}
return TRUE;;
case WM_NCHITTEST:
break;
case WM_COPYDATA:
break;
case WM_CONTEXTMENU:
break;
case WM_INITMENU:
break;
case WM_MENUSELECT:
break;
case WM_MENUCHAR:
break;
case WM_LBUTTONDOWN:
break;
case WM_SETCURSOR:
break;
case WM_DRAWITEM:
if (wParam == 0 || ((MEASUREITEMSTRUCT*)lParam)->CtlType != ODT_MENU)
break;
DrawMenuItem((LPMEASUREITEMSTRUCT)lParam);
return TRUE
case WM_MEASUREITEM:
if (wParam == 0 || ((MEASUREITEMSTRUCT*)lParam)->CtlType != ODT_MENU)
break;
MeasureMenuItem((LPMEASUREITEMSTRUCT)lParam);
return TRUE
case 0x7eb:
break;
case 0x7ec:
break;
case 0x7ed:
break;
case 0x7ee:
break;
case 0x7f0:
break;
case 0x7f3:
break;
case 0x7f4:
break;
case 0x7f5:
break;
case 0x7f7:
break;
case 0x7fe:
break;
case 0x7ff:
break;
case 0x801:
case WM_DRAWCLIPBOARD:
case WM_CHANGECBCHAIN:
break;
case 0x802:
break;
case 0x803:
break;
case 0x804:
break;
case 0x810:
if (ghMenu) {
ClearOwnerDrawMenu(ghMenu, 1);
DestroyMenu(ghMenu);
}
ghMenu = LocalizeMenu(ghInstance, MAKEINTRESOURCE(102));
CreateContextMenu(GetSubMenu(ghMenu, 3));
LocalizeContextMenu(ghMenu, TRUE);
SetMenu(hWnd, ghMenu);
return 0;
case WM_HELP:
break;
case WM_DESTROY:
case WM_ENDSESSION:
ResetEvent(ghEvent);
if (gbTrayIconPresent) {
gbTrayIconPresent = FALSE;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = 0x6b;
if (!Shell_NofifyIcon(NIM_DELETE, &nid) && uMsg == WM_DESTROY)
ShowErrMsg("Shell_NotifyIcon(Delete)");
}
while (!PostThreadMessage(idThread, 0x405, 0, 0))
if (GetLastError() == 0x5a4) break;
WaitForSingleObject(ghThreadHandle, INFINITE);
CloseHandle(ghThreadHandle);
if (gpJobDropTarget) gpJobDropTarget->DeleteDropTarget();
if (gpBasketDropTarget) gpBasketDropTarget->DeleteDropTarget();
DestroyWindow(ghDropBasketWin);
if (ghMenu) {
SetMenu(hWnd, 0);
ClearOwnerDrawMenu(ghMenu, 1);
DestroyMenu(ghMenu);
}
---- 我曾经不只一次的在网络上寻找MM,
可是,网络一次一次的让我失望,
因为,那些MM不是一个比一个丑,
就是一个比一个恐怖,
直到我遇见她,
一个比我小很多的小MM,
我对她几乎是一见钟情,
可是,她没有发觉我
发觉我已经喜欢上了她,
她仍然每次上网
都是那么的可爱,
可是,却不知道
我因她而日子过得了无生趣
我对她表白,得到的只是
年龄是个问题,空间是个距离 |
|