本文整理汇总了C++中COptItem_TreeCtrl::IDToOrder方法的典型用法代码示例。如果您正苦于以下问题:C++ COptItem_TreeCtrl::IDToOrder方法的具体用法?C++ COptItem_TreeCtrl::IDToOrder怎么用?C++ COptItem_TreeCtrl::IDToOrder使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类COptItem_TreeCtrl
的用法示例。
在下文中一共展示了COptItem_TreeCtrl::IDToOrder方法的10个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: SetDefMsg
void CMsgTree::SetDefMsg(int iMode, int ID)
{
for (int i = 0; i < _countof(SettingsList); i++) {
if (SettingsList[i].Status == iMode) {
if (MsgTreePage.GetValue(SettingsList[i].DBSetting) != ID) {
RECT rc;
COptItem_TreeCtrl *TreeCtrl = GetTreeCtrl();
int OrderOld = TreeCtrl->IDToOrder(MsgTreePage.GetValue(SettingsList[i].DBSetting));
if (OrderOld >= 0 && TreeView_GetItemRect(hTreeView, TreeCtrl->Value[OrderOld].hItem, &rc, false))
InvalidateRect(hTreeView, &rc, true); // refresh icons of previous default tree item
int OrderNew = TreeCtrl->IDToOrder(ID);
if (OrderNew >= 0 && TreeView_GetItemRect(hTreeView, TreeCtrl->Value[OrderNew].hItem, &rc, false))
InvalidateRect(hTreeView, &rc, true); // refresh new default item icons
MsgTreePage.SetValue(SettingsList[i].DBSetting, ID);
NMMSGTREE nm = { 0 };
if (OrderOld >= 0)
nm.ItemOld = &TreeCtrl->Value[OrderOld];
if (OrderNew >= 0)
nm.ItemNew = &TreeCtrl->Value[OrderNew];
nm.hdr.code = MTN_DEFMSGCHANGED;
nm.hdr.hwndFrom = hTreeView;
nm.hdr.idFrom = GetDlgCtrlID(hTreeView);
SendMessage(GetParent(hTreeView), WM_NOTIFY, 0, (LPARAM)&nm);
}
break;
}
}
}
示例2: GetNextItem
CBaseTreeItem* CMsgTree::GetNextItem(int Flags, CBaseTreeItem* Item) // Item is 'int ID' if MTGN_BYID flag is set; returns CBaseTreeItem* or NULL
{
COptItem_TreeCtrl *TreeCtrl = GetTreeCtrl();
CBaseTreeItem* TreeItem = Item;
if (Flags & MTGN_BYID) {
int Order = TreeCtrl->IDToOrder((int)Item);
_ASSERT(Order != -1);
TreeItem = (Order <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(Order)] : (CBaseTreeItem*)&TreeCtrl->Value[Order];
}
int TVFlag = 0;
switch (Flags & ~MTGN_BYID) {
case MTGN_ROOT: TVFlag = TVGN_ROOT; break;
case MTGN_CHILD: TVFlag = TVGN_CHILD; break;
case MTGN_PARENT: TVFlag = TVGN_PARENT; break;
case MTGN_NEXT: TVFlag = TVGN_NEXT; break;
case MTGN_PREV: TVFlag = TVGN_PREVIOUS; break;
default: _ASSERT(0);
}
int Order = TreeCtrl->hItemToOrder(TreeView_GetNextItem(hTreeView, TreeItem ? TreeItem->hItem : NULL, TVFlag));
if (Order == -1)
return NULL;
return (Order <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(Order)] : (CBaseTreeItem*)&TreeCtrl->Value[Order];
}
示例3: DeleteSelectedItem
bool CMsgTree::DeleteSelectedItem() // returns true if the item was deleted
{
COptItem_TreeCtrl *TreeCtrl = GetTreeCtrl();
int Order = TreeCtrl->IDToOrder(TreeCtrl->GetSelectedItemID(GetParent(hTreeView)));
_ASSERT(Order >= 0);
CTreeItem *SelectedItem = &TreeCtrl->Value[Order];
//NightFox: fix for langpack and fix cut char space in text
if (MessageBox(GetParent(hTreeView),
((SelectedItem->Flags & TIF_GROUP) ?
TranslateT("Do you really want to delete this category with its messages?") :
TranslateT("Do you really want to delete this message?")),
TranslateT("New Away System"), MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2) == IDYES) {
NMMSGTREE nm = { 0 };
nm.ItemOld = SelectedItem;
nm.hdr.code = MTN_DELETEITEM;
nm.hdr.hwndFrom = hTreeView;
nm.hdr.idFrom = GetDlgCtrlID(hTreeView);
if (!SendMessage(GetParent(hTreeView), WM_NOTIFY, 0, (LPARAM)&nm)) {
TreeCtrl->Delete(GetParent(hTreeView), TreeCtrl->GetSelectedItemID(GetParent(hTreeView)));
return true;
}
}
return false;
}
示例4: UpdateItem
void CMsgTree::UpdateItem(int ID) // updates item title, and expanded/collapsed state for groups
{
COptItem_TreeCtrl *TreeCtrl = GetTreeCtrl();
int Order = TreeCtrl->IDToOrder(ID);
if (Order != -1) {
CBaseTreeItem* TreeItem = (Order <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(Order)] : (CBaseTreeItem*)&TreeCtrl->Value[Order];
TCString NewTitle;
TVITEM tvi;
tvi.mask = TVIF_HANDLE | TVIF_TEXT;
tvi.hItem = TreeItem->hItem;
tvi.pszText = NewTitle.GetBuffer(TREEITEMTITLE_MAXLEN);
tvi.cchTextMax = TREEITEMTITLE_MAXLEN;
TreeView_GetItem(hTreeView, &tvi);
if (TreeItem->Title != (const TCHAR*)tvi.pszText) {
TreeCtrl->SetModified(true);
NMMSGTREE nm = { 0 };
nm.ItemNew = TreeItem;
nm.hdr.code = MTN_ITEMRENAMED;
nm.hdr.hwndFrom = hTreeView;
nm.hdr.idFrom = GetDlgCtrlID(hTreeView);
SendMessage(GetParent(hTreeView), WM_NOTIFY, 0, (LPARAM)&nm);
}
tvi.mask = TVIF_HANDLE | TVIF_TEXT;
tvi.pszText = TreeItem->Title;
TreeView_SetItem(hTreeView, &tvi);
TreeView_Expand(hTreeView, tvi.hItem, (TreeItem->Flags & TIF_EXPANDED) ? TVE_EXPAND : TVE_COLLAPSE);
}
}
示例5: GetSelection
CBaseTreeItem* CMsgTree::GetSelection() // returns NULL if there's nothing selected
{
COptItem_TreeCtrl *TreeCtrl = GetTreeCtrl();
int Order = TreeCtrl->IDToOrder(TreeCtrl->GetSelectedItemID(GetParent(hTreeView)));
if (Order == -1)
return NULL;
return (Order <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(Order)] : (CBaseTreeItem*)&TreeCtrl->Value[Order];
}
示例6: SetSelection
bool CMsgTree::SetSelection(int ID, int Flags) // set ID = -1 to unselect; returns TRUE on unselect and on successful select
{
COptItem_TreeCtrl *TreeCtrl = GetTreeCtrl();
int Order = (Flags & MTSS_BYORDER) ? ID : TreeCtrl->IDToOrder(ID);
if (Order == -1 && ID != -1)
return false;
TreeView_SelectItem(hTreeView, (Order == -1) ? NULL : ((Order <= TREECTRL_ROOTORDEROFFS) ? TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(Order)].hItem : TreeCtrl->Value[Order].hItem));
return true;
}
示例7: GetMsgFormat
// returns the requested message; sets Order to the order of the message in the message tree, if available; or to -1 otherwise.
TCString CProtoSettings::GetMsgFormat(int Flags, int *pOrder)
{
TCString Message = NULL;
if (pOrder)
*pOrder = -1;
if (Flags & GMF_TEMPORARY) {
_ASSERT(!Status || Status == g_ProtoStates[szProto].Status);
if (g_ProtoStates[szProto].TempMsg.IsSet()) {
Message = g_ProtoStates[szProto].TempMsg;
Flags &= ~GMF_PERSONAL; // don't allow personal message to overwrite our NULL temporary message
}
}
if (Flags & GMF_PERSONAL && Message == NULL) // try getting personal message (it overrides global)
Message = db_get_s(NULL, MOD_NAME, ProtoStatusToDBSetting(DB_STATUSMSG, IDC_MOREOPTDLG_PERSTATUSPROTOMSGS), (TCHAR*)NULL);
if (Flags & GMF_PROTOORGLOBAL && Message == NULL) {
Message = CProtoSettings().GetMsgFormat(GMF_PERSONAL | (Flags & GMF_TEMPORARY), pOrder);
return (Message == NULL) ? _T("") : Message; // global message can't be NULL
}
if (Flags & GMF_LASTORDEFAULT && Message == NULL) { // try to get the last or default message, depending on current settings
COptPage MsgTreeData(g_MsgTreePage);
COptItem_TreeCtrl *TreeCtrl = (COptItem_TreeCtrl*)MsgTreeData.Find(IDV_MSGTREE);
TreeCtrl->DBToMem(CString(MOD_NAME));
Message = NULL;
if (g_MoreOptPage.GetDBValueCopy(IDC_MOREOPTDLG_USELASTMSG)) { // if using last message by default...
Message = db_get_s(NULL, MOD_NAME, ProtoStatusToDBSetting(DB_STATUSMSG, IDC_MOREOPTDLG_PERSTATUSPROTOMSGS), (TCHAR*)NULL); // try per-protocol message first
if (Message.IsEmpty()) {
Message = NULL; // to be sure it's NULL, not "" - as we're checking 'Message == NULL' later
int RecentGroupID = GetRecentGroupID(Status);
if (RecentGroupID != -1) {
for (int i = 0; i < TreeCtrl->Value.GetSize(); i++) { // find first message in the group
if (TreeCtrl->Value[i].ParentID == RecentGroupID && !(TreeCtrl->Value[i].Flags & TIF_GROUP)) {
Message = TreeCtrl->Value[i].User_Str1;
if (pOrder)
*pOrder = i;
break;
}
}
}
}
} // else, if using default message by default...
if (Message == NULL) { // ...or we didn't succeed retrieving the last message
// get default message for this status
int DefMsgID = -1;
static struct {
int DBSetting, Status;
}
DefMsgDlgItems[] = {
IDS_MESSAGEDLG_DEF_ONL, ID_STATUS_ONLINE,
IDS_MESSAGEDLG_DEF_AWAY, ID_STATUS_AWAY,
IDS_MESSAGEDLG_DEF_NA, ID_STATUS_NA,
IDS_MESSAGEDLG_DEF_OCC, ID_STATUS_OCCUPIED,
IDS_MESSAGEDLG_DEF_DND, ID_STATUS_DND,
IDS_MESSAGEDLG_DEF_FFC, ID_STATUS_FREECHAT,
IDS_MESSAGEDLG_DEF_INV, ID_STATUS_INVISIBLE,
IDS_MESSAGEDLG_DEF_OTP, ID_STATUS_ONTHEPHONE,
IDS_MESSAGEDLG_DEF_OTL, ID_STATUS_OUTTOLUNCH
};
for (int i = 0; i < SIZEOF(DefMsgDlgItems); i++) {
if (DefMsgDlgItems[i].Status == Status) {
DefMsgID = MsgTreeData.GetDBValue(DefMsgDlgItems[i].DBSetting);
break;
}
}
if (DefMsgID == -1)
DefMsgID = MsgTreeData.GetDBValue(IDS_MESSAGEDLG_DEF_AWAY); // use away message for unknown statuses
int Order = TreeCtrl->IDToOrder(DefMsgID); // this will return -1 in any case if something goes wrong
if (Order >= 0)
Message = TreeCtrl->Value[Order].User_Str1;
if (pOrder)
*pOrder = Order;
}
if (Message == NULL)
Message = _T(""); // last or default message can't be NULL.. otherwise ICQ won't reply to status message requests and won't notify us of status message requests at all
}
return Message;
}
示例8: SetMsgFormat
void CProtoSettings::SetMsgFormat(int Flags, TCString Message)
{
if (Flags & (SMF_TEMPORARY | SMF_PERSONAL) && g_AutoreplyOptPage.GetDBValueCopy(IDC_REPLYDLG_RESETCOUNTERWHENSAMEICON) && GetMsgFormat(Flags & (SMF_TEMPORARY | SMF_PERSONAL)) != (const TCHAR*)Message)
ResetSettingsOnStatusChange(szProto);
if (Flags & SMF_TEMPORARY) {
_ASSERT(!Status || Status == g_ProtoStates[szProto].Status);
g_ProtoStates[szProto].TempMsg = (szProto || Message != NULL) ? Message : CProtoSettings(NULL, Status).GetMsgFormat(GMF_LASTORDEFAULT);
}
if (Flags & SMF_PERSONAL) { // set a "personal" message for a protocol. also it's used to set global status message (hContact = NULL).
// if Message == NULL, then we'll use the "default" message - i.e. it's either the global message for szProto != NULL (we delete the per-proto DB setting), or it's just a default message for a given status for szProto == NULL.
g_ProtoStates[szProto].TempMsg.Unset();
CString DBSetting(ProtoStatusToDBSetting(DB_STATUSMSG, IDC_MOREOPTDLG_PERSTATUSPROTOMSGS));
if (Message != NULL)
db_set_ts(NULL, MOD_NAME, DBSetting, Message);
else {
if (!szProto)
db_set_ts(NULL, MOD_NAME, DBSetting, CProtoSettings(NULL, Status).GetMsgFormat(GMF_LASTORDEFAULT)); // global message can't be NULL; we can use an empty string instead if it's really necessary
else
db_unset(NULL, MOD_NAME, DBSetting);
}
}
if (Flags & SMF_LAST) {
COptPage MsgTreeData(g_MsgTreePage);
COptItem_TreeCtrl *TreeCtrl = (COptItem_TreeCtrl*)MsgTreeData.Find(IDV_MSGTREE);
TreeCtrl->DBToMem(CString(MOD_NAME));
int RecentGroupID = GetRecentGroupID(Status);
if (RecentGroupID == -1) { // we didn't find the group, it also means that we're using per status messages; so we need to create it
TreeCtrl->Value.AddElem(CTreeItem(Status ? pcli->pfnGetStatusModeDescription(Status, 0) : MSGTREE_RECENT_OTHERGROUP, g_Messages_RecentRootID, RecentGroupID = TreeCtrl->GenerateID(), TIF_GROUP));
TreeCtrl->SetModified(true);
}
int i;
// try to find an identical message in the same group (to prevent saving multiple identical messages),
// or at least if we'll find an identical message somewhere else, then we'll use its title for our new message
TCString Title(_T(""));
for (i = 0; i < TreeCtrl->Value.GetSize(); i++) {
if (!(TreeCtrl->Value[i].Flags & TIF_GROUP) && TreeCtrl->Value[i].User_Str1 == (const TCHAR*)Message) {
if (TreeCtrl->Value[i].ParentID == RecentGroupID) { // found it in the same group
int GroupOrder = TreeCtrl->IDToOrder(RecentGroupID);
TreeCtrl->Value.MoveElem(i, (GroupOrder >= 0) ? (GroupOrder + 1) : 0); // now move it to the top of recent messages list
TreeCtrl->SetModified(true);
break; // no reason to search for anything else
}
if (Title.IsEmpty()) // it's not in the same group, but at least we'll use its title
Title = TreeCtrl->Value[i].Title;
}
}
if (i == TreeCtrl->Value.GetSize()) { // we didn't find an identical message in the same group, so we'll add our new message here
if (Title.IsEmpty()) { // didn't find a title for our message either
if (Message.GetLen() > MRM_MAX_GENERATED_TITLE_LEN)
Title = Message.Left(MRM_MAX_GENERATED_TITLE_LEN - 3) + _T("...");
else
Title = Message;
TCHAR *p = Title.GetBuffer();
while (*p) { // remove "garbage"
if (!(p = _tcspbrk(p, _T("\r\n\t"))))
break;
*p++ = ' ';
}
Title.ReleaseBuffer();
}
int GroupOrder = TreeCtrl->IDToOrder(RecentGroupID);
TreeCtrl->Value.InsertElem(CTreeItem(Title, RecentGroupID, TreeCtrl->GenerateID(), 0, Message), (GroupOrder >= 0) ? (GroupOrder + 1) : 0);
TreeCtrl->SetModified(true);
}
// now clean up here
int MRMNum = 0;
int MaxMRMNum = g_MoreOptPage.GetDBValueCopy(IDC_MOREOPTDLG_RECENTMSGSCOUNT);
for (i = 0; i < TreeCtrl->Value.GetSize(); i++) {
if (TreeCtrl->Value[i].ParentID == RecentGroupID) { // found a child of our group
if (TreeCtrl->Value[i].Flags & TIF_GROUP || ++MRMNum > MaxMRMNum) { // what groups are doing here?! :))
TreeCtrl->Value.RemoveElem(i);
TreeCtrl->SetModified(true);
i--;
}
}
}
// if we're saving recent messages per status, then remove any messages that were left at the recent messages' root
if (g_MoreOptPage.GetDBValueCopy(IDC_MOREOPTDLG_PERSTATUSMRM)) {
for (i = 0; i < TreeCtrl->Value.GetSize(); i++) {
if (TreeCtrl->Value[i].ParentID == g_Messages_RecentRootID) {
if (!(TreeCtrl->Value[i].Flags & TIF_GROUP)) {
TreeCtrl->Value.RemoveElem(i);
TreeCtrl->SetModified(true);
i--;
}
}
}
}
TreeCtrl->MemToDB(CString(MOD_NAME));
}
}
示例9: CallWindowProc
static LRESULT CALLBACK ParentSubclassProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
CMsgTree *dat = CWndUserData(hWnd).GetMsgTree();
switch (Msg) {
case WM_NOTIFY:
if (((LPNMHDR)lParam)->hwndFrom == dat->hTreeView) {
switch (((LPNMHDR)lParam)->code) {
case TVN_BEGINDRAG:
{
LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam;
NMMSGTREE nm = { 0 };
COptItem_TreeCtrl *TreeCtrl = dat->GetTreeCtrl();
int Order = TreeCtrl->hItemToOrder(pnmtv->itemNew.hItem);
_ASSERT(Order != -1);
if (Order != -1) {
nm.ItemOld = (Order <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(Order)] : (CBaseTreeItem*)&TreeCtrl->Value[Order];
nm.hdr.code = MTN_BEGINDRAG;
nm.hdr.hwndFrom = dat->hTreeView;
nm.hdr.idFrom = GetDlgCtrlID(dat->hTreeView);
if (!SendMessage(hWnd, WM_NOTIFY, 0, (LPARAM)&nm)) {
SetCapture(hWnd);
dat->hPrevDropTarget = dat->hDragItem = pnmtv->itemNew.hItem;
SetFocus(dat->hTreeView);
TreeView_SelectItem(dat->hTreeView, dat->hDragItem);
}
}
}
break;
case TVN_SELCHANGED:
if (dat->UpdateLock)
return 0;
else {
LPNMTREEVIEW pnmtv = (LPNMTREEVIEW)lParam;
NMMSGTREE nm = { 0 };
COptItem_TreeCtrl *TreeCtrl = dat->GetTreeCtrl();
if (pnmtv->itemOld.hItem) {
int Order = TreeCtrl->IDToOrder(pnmtv->itemOld.lParam);
if (Order != -1) {
nm.ItemOld = (Order <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(Order)] : (CBaseTreeItem*)&TreeCtrl->Value[Order];
}
}
if (pnmtv->itemNew.hItem) {
int Order = TreeCtrl->IDToOrder(pnmtv->itemNew.lParam);
if (Order != -1) {
nm.ItemNew = (Order <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(Order)] : (CBaseTreeItem*)&TreeCtrl->Value[Order];
}
}
nm.hdr.code = MTN_SELCHANGED;
nm.hdr.hwndFrom = dat->hTreeView;
nm.hdr.idFrom = GetDlgCtrlID(dat->hTreeView);
SendMessage(hWnd, WM_NOTIFY, 0, (LPARAM)&nm);
}
break;
case TVN_BEGINLABELEDIT:
if (dat->GetTreeCtrl()->IDToOrder(((LPNMTVDISPINFO)lParam)->item.lParam) < 0)
return true; // cancel editing
g_OrigEditProc = (WNDPROC)SetWindowLongPtr(TreeView_GetEditControl(dat->hTreeView), GWLP_WNDPROC, (LONG_PTR)EditSubclassProc);
break;
case TVN_ENDLABELEDIT:
{
LPNMTVDISPINFO ptvdi = (LPNMTVDISPINFO)lParam;
if (ptvdi->item.pszText) {
COptItem_TreeCtrl *TreeCtrl = dat->GetTreeCtrl();
int Order = TreeCtrl->IDToOrder(ptvdi->item.lParam);
if (Order >= 0) {
TreeCtrl->Value[Order].Title = ptvdi->item.pszText;
TreeCtrl->SetModified(true);
NMMSGTREE nm = { 0 };
nm.ItemNew = &TreeCtrl->Value[Order];
nm.hdr.code = MTN_ITEMRENAMED;
nm.hdr.hwndFrom = dat->hTreeView;
nm.hdr.idFrom = GetDlgCtrlID(dat->hTreeView);
SendMessage(GetParent(dat->hTreeView), WM_NOTIFY, 0, (LPARAM)&nm);
return true; // commit new text
}
}
}
break;
case NM_CLICK:
case NM_RCLICK:
{
TVHITTESTINFO hitTest;
hitTest.pt.x = (short)LOWORD(GetMessagePos());
hitTest.pt.y = (short)HIWORD(GetMessagePos());
ScreenToClient(dat->hTreeView, &hitTest.pt);
TreeView_HitTest(dat->hTreeView, &hitTest);
if (hitTest.hItem) {
if (TreeView_GetSelection(dat->hTreeView) == hitTest.hItem) // make sure TVN_SELCHANGED notification is sent always, even if previous selected item was the same as new
TreeView_SelectItem(dat->hTreeView, NULL);
TreeView_SelectItem(dat->hTreeView, hitTest.hItem);
}
}
break;
case NM_CUSTOMDRAW:
//.........这里部分代码省略.........
示例10: DefWindowProc
static LRESULT CALLBACK MsgTreeSubclassProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
CMsgTree *dat = CWndUserData(GetParent(hWnd)).GetMsgTree();
switch (Msg) {
case UM_MSGTREE_UPDATE: // returns TRUE if updated
{
bool Modified = dat->MsgTreePage.GetModified();
TCString WndTitle;
if (Modified) {
WndTitle.GetBuffer(256);
HWND hCurWnd = hWnd;
do {
hCurWnd = GetParent(hCurWnd);
} while (hCurWnd && !GetWindowText(hCurWnd, WndTitle, 256));
WndTitle.ReleaseBuffer();
}
if (!Modified || MessageBox(GetParent(hWnd), TCString(TranslateT("You've made changes to multiple message trees at a time.\r\nDo you want to leave changes in \"")) + WndTitle + TranslateT("\" dialog?\r\nPress Yes to leave changes in this dialog, or No to discard its changes and save changes of the other message tree instead."), WndTitle + _T(" - ") + TranslateT("New Away System"), MB_ICONQUESTION | MB_YESNO) == IDNO) {
COptItem_TreeCtrl *TreeCtrl = dat->GetTreeCtrl();
TCString OldTitle, OldMsg, NewTitle, NewMsg;
int OldOrder = TreeCtrl->IDToOrder(TreeCtrl->GetSelectedItemID(GetParent(hWnd)));
if (OldOrder != -1) {
CBaseTreeItem* ItemOld = (OldOrder <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(OldOrder)] : (CBaseTreeItem*)&TreeCtrl->Value[OldOrder];
OldTitle = ItemOld->Title;
if (!(ItemOld->Flags & TIF_ROOTITEM))
OldMsg = ((CTreeItem*)ItemOld)->User_Str1;
}
dat->UpdateLock++;
dat->MsgTreePage.DBToMemToPage();
dat->UpdateLock--;
NMMSGTREE nm = { 0 };
int Order = TreeCtrl->IDToOrder(TreeCtrl->GetSelectedItemID(GetParent(hWnd)));
if (Order != -1) {
nm.ItemNew = (Order <= TREECTRL_ROOTORDEROFFS) ? (CBaseTreeItem*)&TreeCtrl->RootItems[ROOT_ORDER_TO_INDEX(Order)] : (CBaseTreeItem*)&TreeCtrl->Value[Order];
NewTitle = nm.ItemNew->Title;
if (!(nm.ItemNew->Flags & TIF_ROOTITEM))
NewMsg = ((CTreeItem*)nm.ItemNew)->User_Str1;
}
if (OldTitle.IsEmpty())
OldTitle = _T(""); // to be sure that NULL will be equal to "" in the latter comparisons
if (OldMsg.IsEmpty())
OldMsg = _T("");
if (NewTitle.IsEmpty())
NewTitle = _T("");
if (NewMsg.IsEmpty())
NewMsg = _T("");
if (OldTitle != (const TCHAR*)NewTitle || OldMsg != (const TCHAR*)NewMsg) {
// probably it's better to leave nm.ItemOld = NULL, to prevent accidental rewriting of it with old data from an edit control etc.
nm.hdr.code = MTN_SELCHANGED;
nm.hdr.hwndFrom = hWnd;
nm.hdr.idFrom = GetDlgCtrlID(hWnd);
SendMessage(GetParent(hWnd), WM_NOTIFY, 0, (LPARAM)&nm);
}
return true;
}
}
return false;
case WM_KEYDOWN:
switch (wParam) {
case VK_DELETE:
dat->DeleteSelectedItem();
break;
case VK_INSERT:
dat->AddMessage();
break;
}
break;
case WM_RBUTTONDOWN:
SetFocus(hWnd);
{
TVHITTESTINFO hitTest;
hitTest.pt.x = (short)LOWORD(lParam);
hitTest.pt.y = (short)HIWORD(lParam);
TreeView_HitTest(hWnd, &hitTest);
if (hitTest.hItem && hitTest.flags & TVHT_ONITEM)
TreeView_SelectItem(hWnd, hitTest.hItem);
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
break;
case WM_CONTEXTMENU:
{
TVHITTESTINFO ht;
ht.pt.x = GET_X_LPARAM(lParam);
ht.pt.y = GET_Y_LPARAM(lParam);
TVITEM tvi = { 0 };
if (ht.pt.x == -1 && ht.pt.y == -1) { // use selected item
if (tvi.hItem = TreeView_GetSelection(hWnd)) {
TreeView_EnsureVisible(hWnd, tvi.hItem);
RECT rc;
TreeView_GetItemRect(hWnd, tvi.hItem, &rc, true);
ht.pt.x = rc.left;
ht.pt.y = rc.bottom;
}
}
else {
ScreenToClient(hWnd, &ht.pt);
//.........这里部分代码省略.........