⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wince_buddies.cpp

📁 swain-0.5.2.zip的源代码,比较好用,希望大家喜欢.
💻 CPP
字号:
/*
This file is part of SWAIN (http://sourceforge.net/projects/swain).
Copyright (C) 2006  Daniel Lindstr鰉 and Daniel Nilsson

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA  02110-1301, USA.
*/
#include "stdafx.h"
#include "wince_client.h"
#include "wince_buddies.h"
#include "../common/BuddyList.h"
#include "../common/BuddyListUI.h"
#include "../common/PacketConnect.h"
#include <commctrl.h>

#define BUDDY_FILE	"buddies.txt"

#define SHMenuBar_GetMenu(hWndMB,idMenu) (HMENU)SendMessage((hWndMB), SHCMBM_GETSUBMENU, (WPARAM)0, (LPARAM)idMenu)

class WinCEBuddyListUI : public BuddyListUI {
private:
	HWND hUserList;
	HWND hGroupList;
	int userCount;
	int groupCount;

	void initUserList(void);
	void initGroupList(void);

public:
	WinCEBuddyListUI(HWND hUL, HWND hGL);
	virtual ~WinCEBuddyListUI(void);

	virtual void clearUsers(void);
	virtual void clearGroups(void);
	virtual void addUser(int uid, WCHAR *name, int status);
	virtual void changeUser(int uid, WCHAR *name, int status);
	virtual void addGroup(int gid, WCHAR *name, int status, bool selected);
	virtual void changeGroup(int gid, WCHAR *name, int status, bool selected);

	int userListProc(HWND hDlg, LPNMHDR pnmh);
	int groupListProc(HWND hDlg, LPNMHDR pnmh);
	int getSelectedUser(void);
};

static BuddyList *buddyList;
static WinCEBuddyListUI *buddyListUI;
static HWND hBuddyMenuBar;
static int selected_uid = -1;

static void UpdateShowMenu(bool groups, bool fav);
static void UpdateShowMenuStatus(int idm);

WinCEBuddyListUI::WinCEBuddyListUI(HWND hUL, HWND hGL) {
	hUserList = hUL;
	hGroupList = hGL;
	userCount = 0;
	groupCount = 0;
	initUserList();
	initGroupList();
}

WinCEBuddyListUI::~WinCEBuddyListUI(void) {
}

void WinCEBuddyListUI::clearUsers(void) {
	ListView_DeleteAllItems(hUserList);
}

void WinCEBuddyListUI::clearGroups(void) {
	ListView_DeleteAllItems(hGroupList);
}

void WinCEBuddyListUI::addUser(int uid, WCHAR *name, int status) {
	LVITEM lvI;

	lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
	lvI.state = 0;      
	lvI.stateMask = 0;  
	lvI.iItem = userCount;
	lvI.lParam = uid;
	lvI.iSubItem = 0;
	lvI.pszText = name; 
	lvI.cchTextMax = wcslen(name);
	lvI.iImage = status;
	if (ListView_InsertItem(hUserList, &lvI) == -1) {
		printf("InsertItem failed!\n");
		return;
	}
	userCount++;
}

void WinCEBuddyListUI::changeUser(int uid, WCHAR *name, int status) {
	LVFINDINFO lvfi;
	LVITEM lvI;

	lvfi.flags = LVFI_PARAM;
	lvfi.lParam = uid;
	int i = ListView_FindItem(hUserList, -1, &lvfi);
	if (i == -1) {
		printf("changeUser: Can't find user %d\n", uid);
		return;
	}

	lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
	lvI.state = 0;      
	lvI.stateMask = 0;  
	lvI.iItem = i;
	lvI.lParam = uid;
	lvI.iSubItem = 0;
	lvI.pszText = name; 
	lvI.cchTextMax = wcslen(name);
	lvI.iImage = status;
	if (!ListView_SetItem(hUserList, &lvI)) {
		printf("changeUser: Can't set user info!\n");
		return;
	}
}

void WinCEBuddyListUI::addGroup(int gid, WCHAR *name, int status, bool selected) {
	LVITEM lvI;

	lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
	lvI.state = selected ? LVIS_SELECTED : 0;      
	lvI.stateMask = LVIS_SELECTED;  
	lvI.iItem = groupCount;
	lvI.lParam = gid;
	lvI.iSubItem = 0;
	lvI.pszText = name; 
	lvI.cchTextMax = wcslen(name);
	lvI.iImage = status;
	if (ListView_InsertItem(hGroupList, &lvI) == -1) {
		printf("InsertItem failed!\n");
		return;
	}
	groupCount++;
}


int WinCEBuddyListUI::getSelectedUser(void){
	LVITEM lvI;
	int iSelect=SendMessage(hUserList, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
	if(iSelect == -1)
		return(-1);
	lvI.mask = LVIF_PARAM;
	lvI.iItem = iSelect;
	lvI.iSubItem = 0;
	ListView_GetItem(hUserList, &lvI);
	return(lvI.lParam);
}



void WinCEBuddyListUI::changeGroup(int gid, WCHAR *name, int status, bool selected) {
	LVFINDINFO lvfi;
	LVITEM lvI;

	lvfi.flags = LVFI_PARAM;
	lvfi.lParam = gid;
	int i = ListView_FindItem(hGroupList, -1, &lvfi);
	if (i == -1) {
		printf("changeGroup: Can't find group %d\n", gid);
		return;
	}

	lvI.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE | LVIF_PARAM;
	lvI.state = selected ? LVIS_SELECTED : 0;
	lvI.stateMask = LVIS_SELECTED;
	lvI.iItem = i;
	lvI.lParam = gid;
	lvI.iSubItem = 0;
	lvI.pszText = name; 
	lvI.cchTextMax = wcslen(name);
	lvI.iImage = status;
	if (!ListView_SetItem(hGroupList, &lvI)) {
		printf("changeGroup: Can't set group info!\n");
		return;
	}
}




static void UpdateShowMenu(bool groups, bool fav) {
	HMENU hmnu = SHMenuBar_GetMenu(hBuddyMenuBar, IDM_BUDDIES_SHOW);
	if (groups) {
		CheckMenuItem(hmnu, IDM_BUDDIES_SHOW_ALLGROUPS, MF_BYCOMMAND | fav ? MF_UNCHECKED : MF_CHECKED);
		CheckMenuItem(hmnu, IDM_BUDDIES_SHOW_FAVGROUPS, MF_BYCOMMAND | fav ? MF_CHECKED : MF_UNCHECKED);
	} else {
		CheckMenuItem(hmnu, IDM_BUDDIES_SHOW_ALLUSERS, MF_BYCOMMAND | fav ? MF_UNCHECKED : MF_CHECKED);
		CheckMenuItem(hmnu, IDM_BUDDIES_SHOW_FAVUSERS, MF_BYCOMMAND | fav ? MF_CHECKED : MF_UNCHECKED);
	}
}

static void UpdateShowMenuStatus(int idm) {
	static int oldidm = IDM_BUDDIES_SHOW_AWAY;
	HMENU hmnu = SHMenuBar_GetMenu(hBuddyMenuBar, IDM_BUDDIES_SHOW);
	
	if (oldidm != -1) {
		CheckMenuItem(hmnu, oldidm, MF_BYCOMMAND | MF_UNCHECKED);
	}
	CheckMenuItem(hmnu, idm, MF_BYCOMMAND | MF_CHECKED);
	oldidm = idm;
}

// Message handler for buddies dialog.
INT_PTR CALLBACK Buddies(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	int ret;
    switch (message)
    {
        case WM_INITDIALOG:
            {
                // Create a Done button and size it.  
                SHINITDLGINFO shidi;
                shidi.dwMask = SHIDIM_FLAGS;
                shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN | SHIDIF_EMPTYMENU;
                shidi.hDlg = hDlg;
                SHInitDialog(&shidi);

				SHMENUBARINFO mbi;
				memset(&mbi, 0, sizeof(SHMENUBARINFO));
				mbi.cbSize     = sizeof(SHMENUBARINFO);
				mbi.hwndParent = hDlg;
				mbi.nToolBarId = IDR_BUDDIES_MENU;
				mbi.hInstRes   = g_hInst;

				if (!SHCreateMenuBar(&mbi)) 
				{
					hBuddyMenuBar = NULL;
				}
				else
				{
					hBuddyMenuBar = mbi.hwndMB;
				}
				buddyListUI = new WinCEBuddyListUI(GetDlgItem(hDlg, IDC_USERLIST), GetDlgItem(hDlg, IDC_GROUPLIST));
				buddyList->setUI(buddyListUI);
				buddyList->refresh(true, true, true);
				UpdateShowMenu(false, buddyList->getOnlyFavUsers());
				UpdateShowMenu(true, buddyList->getOnlyFavGroups());
				switch (buddyList->getLowestStatus()) {
					case STATUS_ONLINE:	UpdateShowMenuStatus(IDM_BUDDIES_SHOW_ONLINE);	break;
					case STATUS_AWAY:	UpdateShowMenuStatus(IDM_BUDDIES_SHOW_AWAY);	break;
					case STATUS_OFFLINE:UpdateShowMenuStatus(IDM_BUDDIES_SHOW_OFFLINE);	break;
				}
            }
            return (INT_PTR)TRUE;

		case WM_NOTIFY:
			switch (wParam) {
				case IDC_USERLIST:
					ret = buddyListUI->userListProc(hDlg, (LPNMHDR) lParam);
					SetWindowLong(hDlg, DWL_MSGRESULT, ret);
					return TRUE;
				case IDC_GROUPLIST:
					ret = buddyListUI->groupListProc(hDlg, (LPNMHDR) lParam);
					SetWindowLong(hDlg, DWL_MSGRESULT, ret);
					return TRUE;
				case 0:	// Igore control 0 or output may be spammed by the printf below!
					break;
				default:
					printf("WM_NOTIFY: Unknown control %d\n", wParam);
					break;
			}
			break;

        case WM_COMMAND:
			switch (LOWORD(wParam)) {
				case IDOK:
					selected_uid = buddyListUI->getSelectedUser();
					if(selected_uid == -1){
						MessageBox(hDlg, (TEXT("Select a user.")), (TEXT("Error")), MB_OK);
						break;
					}
	                EndDialog(hDlg, LOWORD(wParam));
		            return TRUE;

				case IDCANCEL:
					selected_uid = -1;
					EndDialog(hDlg, LOWORD(wParam));
					return TRUE;

				case IDM_BUDDIES_MENU_REFRESH:
					buddyList->refresh(true, true, true);
					break;

				case IDM_BUDDIES_SHOW_ALLGROUPS:
					buddyList->showOnlyFavGroups(false);
					buddyList->refresh(false, true, false);
					UpdateShowMenu(true, false);
					break;
				case IDM_BUDDIES_SHOW_FAVGROUPS:
					buddyList->showOnlyFavGroups(true);
					buddyList->refresh(false, true, false);
					UpdateShowMenu(true, true);
					break;
				case IDM_BUDDIES_SHOW_ALLUSERS:
					buddyList->showOnlyFavUsers(false);
					buddyList->refresh(true, false, false);
					UpdateShowMenu(false, false);
					break;
				case IDM_BUDDIES_SHOW_FAVUSERS:
					buddyList->showOnlyFavUsers(true);
					buddyList->refresh(true, false, false);
					UpdateShowMenu(false, true);
					break;
				case IDM_BUDDIES_SHOW_ONLINE:
					buddyList->setLowestStatus(STATUS_ONLINE);
					buddyList->refresh(true, false, true);
					UpdateShowMenuStatus(IDM_BUDDIES_SHOW_ONLINE);
					break;
				case IDM_BUDDIES_SHOW_AWAY:
					buddyList->setLowestStatus(STATUS_AWAY);
					buddyList->refresh(true, false, true);
					UpdateShowMenuStatus(IDM_BUDDIES_SHOW_AWAY);
					break;
				case IDM_BUDDIES_SHOW_OFFLINE:
					buddyList->setLowestStatus(STATUS_OFFLINE);
					buddyList->refresh(true, false, true);
					UpdateShowMenuStatus(IDM_BUDDIES_SHOW_OFFLINE);
					break;
            }
            break;

        case WM_CLOSE:
            EndDialog(hDlg, message);
            return TRUE;
		case WM_DESTROY:
			delete buddyListUI;
            return TRUE;
#ifdef _DEVICE_RESOLUTION_AWARE
        case WM_SIZE:
            {
		DRA::RelayoutDialog(
			g_hInst, 
			hDlg, 
			DRA::GetDisplayMode() != DRA::Portrait ? MAKEINTRESOURCE(IDD_BUDDIES_WIDE) : MAKEINTRESOURCE(IDD_BUDDIES));
            }
            break;
#endif
    }
    return (INT_PTR)FALSE;
}

int WinCEBuddyListUI::userListProc(HWND hDlg, LPNMHDR pnmh) {
	NMRGINFO *pnmrgi;
	int i;
	LVITEM lvI;
	LVHITTESTINFO htinfo;
	HMENU hmnu;

	switch (pnmh->code) {
		case GN_CONTEXTMENU:
			pnmrgi = (NMRGINFO *)pnmh;
			htinfo.pt = pnmrgi->ptAction;
			ScreenToClient(pnmh->hwndFrom, &(htinfo.pt));
			ListView_HitTest(pnmh->hwndFrom, &htinfo);
			if (!(htinfo.flags & LVHT_ONITEM) || htinfo.iItem < 0) {
				break;
			}
			lvI.mask = LVIF_PARAM;
			lvI.iItem = htinfo.iItem;
			lvI.iSubItem = 0;
			ListView_GetItem(pnmh->hwndFrom, &lvI);
			hmnu = CreatePopupMenu();
			if (!buddyList->isFavUser(lvI.lParam)) {
				AppendMenu(hmnu, MF_BYCOMMAND | MF_ENABLED | MF_STRING, IDM_BUDDIES_FAV_ADD, L"Add to favorites");
			} else {
				AppendMenu(hmnu, MF_BYCOMMAND | MF_ENABLED | MF_STRING, IDM_BUDDIES_FAV_REMOVE, L"Remove from favorites");
			}
			i = TrackPopupMenu(hmnu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD, pnmrgi->ptAction.x, pnmrgi->ptAction.y, 0, hDlg, NULL);
			switch (i) {
				case IDM_BUDDIES_FAV_ADD:
					buddyList->addFavUser(lvI.lParam);
					break;
				case IDM_BUDDIES_FAV_REMOVE:
					buddyList->removeFavUser(lvI.lParam);
					break;
			}
			DestroyMenu(hmnu);
			return TRUE;
		case NM_DBLCLK:
			PostMessage(hDlg, WM_COMMAND, IDOK, 0);
			break;
	}
	return FALSE;
}

int WinCEBuddyListUI::groupListProc(HWND hDlg, LPNMHDR pnmh) {
	NMLISTVIEW *pnmlv;
	NMRGINFO *pnmrgi;
	unsigned int state, mask;
	int i;
	LVITEM lvI;
	LVHITTESTINFO htinfo;
	HMENU hmnu;

	switch (pnmh->code) {
		case LVN_ITEMCHANGING:
			pnmlv = (NMLISTVIEW *)pnmh;
			if (pnmlv->uChanged & LVIF_STATE) {
				bool selected = buddyList->isSelectedGroup(pnmlv->lParam);
				if (((pnmlv->uOldState & LVIS_SELECTED) && selected) ||
					((pnmlv->uNewState & LVIS_SELECTED) && !selected)) {
					mask = pnmlv->uOldState ^ pnmlv->uNewState;		// old XOR new = the flags that changed
					mask &= ~LVIS_SELECTED;							// Mask out selected flag
					if (mask) {
						// Some other flags also changed so we need to change those
						// because we are going to veto this change.
						ListView_SetItemState(pnmh->hwndFrom, pnmlv->iItem, pnmlv->uNewState & ~LVIS_SELECTED, mask);
					}
					return TRUE;
				}
			}
			break;
		case GN_CONTEXTMENU:
			pnmrgi = (NMRGINFO *)pnmh;
			htinfo.pt = pnmrgi->ptAction;
			ScreenToClient(pnmh->hwndFrom, &(htinfo.pt));
			ListView_HitTest(pnmh->hwndFrom, &htinfo);
			if (!(htinfo.flags & LVHT_ONITEM) || htinfo.iItem < 0) {
				break;
			}
			lvI.mask = LVIF_PARAM;
			lvI.iItem = htinfo.iItem;
			lvI.iSubItem = 0;
			ListView_GetItem(pnmh->hwndFrom, &lvI);
			hmnu = CreatePopupMenu();
			if (!buddyList->isFavGroup(lvI.lParam)) {
				AppendMenu(hmnu, MF_BYCOMMAND | MF_ENABLED | MF_STRING, IDM_BUDDIES_FAV_ADD, L"Add to favorites");
			} else {
				AppendMenu(hmnu, MF_BYCOMMAND | MF_ENABLED | MF_STRING, IDM_BUDDIES_FAV_REMOVE, L"Remove from favorites");
			}
			i = TrackPopupMenu(hmnu, TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD, pnmrgi->ptAction.x, pnmrgi->ptAction.y, 0, hDlg, NULL);
			switch (i) {
				case IDM_BUDDIES_FAV_ADD:
					buddyList->addFavGroup(lvI.lParam);
					break;
				case IDM_BUDDIES_FAV_REMOVE:
					buddyList->removeFavGroup(lvI.lParam);
					break;
			}
			DestroyMenu(hmnu);
			return TRUE;
		case NM_CLICK:
			pnmlv = (NMLISTVIEW *)pnmh;
			if (pnmlv->iItem < 0) {
				printf("Item is < 0: %d\n", pnmlv->iItem);
				break;
			}
			state = ListView_GetItemState(pnmh->hwndFrom, pnmlv->iItem, LVIS_SELECTED);
			lvI.mask = LVIF_PARAM;
			lvI.iItem = pnmlv->iItem;
			lvI.iSubItem = pnmlv->iSubItem;
			if (!ListView_GetItem(pnmh->hwndFrom, &lvI)) {
				printf("GetItem failed!");
				break;
			}
			if (lvI.lParam < 0) {
				printf("bl

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -