精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>网络与通讯>>网络蚂蚁缘码(二)

主题:网络蚂蚁缘码(二)
发信人: 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, 
我对她几乎是一见钟情, 
可是,她没有发觉我 
发觉我已经喜欢上了她, 
她仍然每次上网 
都是那么的可爱, 
可是,却不知道 
我因她而日子过得了无生趣 
我对她表白,得到的只是 
年龄是个问题,空间是个距离 

[关闭][返回]