static void OpenPlace(HANDLE hDlg,BoardParams *DlgParams,int row,int col,CHECK_OPEN_PLACE check) { FarDialogItem DialogItem; int color; if(row<0) return; if(col<0) return; if(row>=DlgParams->width) return; if(col>=DlgParams->height) return; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,DlgParams->width*col+row,&DialogItem); if(GET_DATA_1(DialogItem)==STATE_CLOSE) { SET_DATA_1(DialogItem,STATE_OPEN); DialogItem.VBuf[1].Char=GetChar(GET_DATA_0(DialogItem),GET_DATA_1(DialogItem),&color); int bgcolor=GetBG(row,col,GET_DATA_1(DialogItem)); DialogItem.VBuf[0].Attributes.ForegroundColor=DialogItem.VBuf[1].Attributes.ForegroundColor=DialogItem.VBuf[2].Attributes.ForegroundColor=color; DialogItem.VBuf[0].Attributes.BackgroundColor=DialogItem.VBuf[1].Attributes.BackgroundColor=DialogItem.VBuf[2].Attributes.BackgroundColor=bgcolor; Info.SendDlgMessage(hDlg,DM_SETDLGITEMSHORT,DlgParams->width*col+row,&DialogItem); if(!GET_DATA_0(DialogItem)) { OpenPlace(hDlg,DlgParams,row-1,col-1,COP_NONE); OpenPlace(hDlg,DlgParams,row-1,col,COP_NONE); OpenPlace(hDlg,DlgParams,row-1,col+1,COP_NONE); OpenPlace(hDlg,DlgParams,row,col-1,COP_NONE); OpenPlace(hDlg,DlgParams,row,col+1,COP_NONE); OpenPlace(hDlg,DlgParams,row+1,col-1,COP_NONE); OpenPlace(hDlg,DlgParams,row+1,col,COP_NONE); OpenPlace(hDlg,DlgParams,row+1,col+1,COP_NONE); } if(check!=COP_NONE) CheckStop(hDlg,DlgParams,row,col); } else if(check==COP_CHECK_ALL&&GET_DATA_1(DialogItem)==STATE_OPEN&&GET_DATA_0(DialogItem)>0&&GET_DATA_0(DialogItem)<9) { int mines=0; mines+=GetMine(row-1,col-1,hDlg,DlgParams,true); mines+=GetMine(row-1,col,hDlg,DlgParams,true); mines+=GetMine(row-1,col+1,hDlg,DlgParams,true); mines+=GetMine(row,col-1,hDlg,DlgParams,true); mines+=GetMine(row,col+1,hDlg,DlgParams,true); mines+=GetMine(row+1,col-1,hDlg,DlgParams,true); mines+=GetMine(row+1,col,hDlg,DlgParams,true); mines+=GetMine(row+1,col+1,hDlg,DlgParams,true); if(mines==GET_DATA_0(DialogItem)) //FIXME { OpenPlace(hDlg,DlgParams,row-1,col-1,COP_CHECK_STOP); OpenPlace(hDlg,DlgParams,row-1,col,COP_CHECK_STOP); OpenPlace(hDlg,DlgParams,row-1,col+1,COP_CHECK_STOP); OpenPlace(hDlg,DlgParams,row,col-1,COP_CHECK_STOP); OpenPlace(hDlg,DlgParams,row,col+1,COP_CHECK_STOP); OpenPlace(hDlg,DlgParams,row+1,col-1,COP_CHECK_STOP); OpenPlace(hDlg,DlgParams,row+1,col,COP_CHECK_STOP); OpenPlace(hDlg,DlgParams,row+1,col+1,COP_CHECK_STOP); CheckStop(hDlg,DlgParams,row,col); } } }
static void SetFocusUser(HANDLE hDlg,BoardParams *DlgParams,bool real) { if(real) Info.SendDlgMessage(hDlg,DM_SETFOCUS,DlgParams->width*DlgParams->curr_col+DlgParams->curr_row,0); else { int curr_elem=(int)Info.SendDlgMessage(hDlg,DM_GETFOCUS,0,0); DlgParams->curr_row=curr_elem%DlgParams->width; DlgParams->curr_col=curr_elem/DlgParams->width; } RedrawPlace(hDlg,DlgParams,true); }
static void RedrawPlace(HANDLE hDlg,BoardParams *DlgParams,bool focused) { int color; FarDialogItem DialogItem; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,DlgParams->width*DlgParams->curr_col+DlgParams->curr_row,&DialogItem); DialogItem.VBuf[1].Char=GetChar(GET_DATA_0(DialogItem),GET_DATA_1(DialogItem),&color); if(focused&&color==(FOREGROUND_RED|FOREGROUND_INTENSITY)) color=0; int bgcolor=focused?(FOREGROUND_RED|FOREGROUND_INTENSITY):(GetBG(DlgParams->curr_row,DlgParams->curr_col,GET_DATA_1(DialogItem))); DialogItem.VBuf[0].Attributes.ForegroundColor=DialogItem.VBuf[1].Attributes.ForegroundColor=DialogItem.VBuf[2].Attributes.ForegroundColor=color; DialogItem.VBuf[0].Attributes.BackgroundColor=DialogItem.VBuf[1].Attributes.BackgroundColor=DialogItem.VBuf[2].Attributes.BackgroundColor=bgcolor; }
static int GetMine(int row,int col,HANDLE hDlg,BoardParams *DlgParams,bool flagged) { if(row<0) return 0; if(col<0) return 0; if(row>=DlgParams->width) return 0; if(col>=DlgParams->height) return 0; FarDialogItem DialogItem; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,col*DlgParams->width+row,&DialogItem); if(flagged) { if(GET_DATA_1(DialogItem)==STATE_MARKED) return 1; } else { if(GET_DATA_0(DialogItem)==9) return 1; } return 0; }
int WINAPI _export Message(unsigned long Msg,void *InData,void *OutData) { (void)OutData; switch(Msg) { case FMMSG_GETINFO: { GetInfoOutData *data=(GetInfoOutData *)OutData; GetMsg(mName,data->MenuString); strcpy(data->HotkeyID,"ay_appendall"); data->Flags=FMMSG_MENU|FMMSG_FILTER; } return TRUE; case FMMSG_MENU: { MenuInData *dlg=(MenuInData *)InData; FarDialogItem Item; if (FarInfo.SendDlgMessage(dlg->hDlg,DM_GETDLGITEM,0,(long)&Item)) { if (!strcmp(Item.Data,GetMsg(mWarningTitle,tmp))) { if (FarInfo.SendDlgMessage(dlg->hDlg,DM_GETDLGITEM,11,(long)&Item)) { if (strstr(Item.Data,GetMsg(mAppendButton,tmp))) { AppendAll=true; FarInfo.SendDlgMessage(dlg->hDlg,DM_CLOSE,11,0); } } } } } return TRUE; case FMMSG_FILTER: { FilterInData *dlg=(FilterInData *)InData; if(dlg->Msg==DN_INITDIALOG && AppendAll) { FarDialogItem Item; if (FarInfo.SendDlgMessage(dlg->hDlg,DM_GETDLGITEM,0,(long)&Item)) { if (!strcmp(Item.Data,GetMsg(mCopyTitle,tmp)) || !strcmp(Item.Data,GetMsg(mMoveTitle,tmp))) { if (FarInfo.SendDlgMessage(dlg->hDlg,DM_GETDLGITEM,12,(long)&Item)) { if (strstr(Item.Data,GetMsg(mTreeButton,tmp))) AppendAll=false; //reset when new copy/move starts } } else if (!strcmp(Item.Data,GetMsg(mWarningTitle,tmp))) { if (FarInfo.SendDlgMessage(dlg->hDlg,DM_GETDLGITEM,11,(long)&Item)) { if (strstr(Item.Data,GetMsg(mAppendButton,tmp))) { FarInfo.SendDlgMessage(dlg->hDlg,DM_CLOSE,11,0); } } } } } } return TRUE; } return FALSE; }
static intptr_t WINAPI MyDlgProc(HANDLE hDlg, intptr_t Msg, intptr_t Param1, void *Param2) { FarGetDialogItem DialogItem={sizeof(FarGetDialogItem)}; const INPUT_RECORD* record; switch (Msg) { case DN_CONTROLINPUT: record=(const INPUT_RECORD *)Param2; if (record->EventType==KEY_EVENT && record->Event.KeyEvent.bKeyDown && record->Event.KeyEvent.dwControlKeyState & SHIFT_PRESSED && (record->Event.KeyEvent.dwControlKeyState & LEFT_CTRL_PRESSED || record->Event.KeyEvent.dwControlKeyState & RIGHT_CTRL_PRESSED)) { switch (record->Event.KeyEvent.wVirtualKeyCode) { case VK_DOWN: ScrollText(stDn); return TRUE; case VK_UP: ScrollText(stUp); return TRUE; case VK_NEXT: ScrollText(stPgDn); return TRUE; case VK_PRIOR: ScrollText(stPgUp); return TRUE; case VK_END: ScrollText(stEnd); return TRUE; case VK_HOME: ScrollText(stHome); return TRUE; } } break; case DN_BTNCLICK: if (Param1==ixCaseSensitive) { bool bCaseSensitive = Param2!=0; if (bCaseSensitive!=bPrevCaseSensitive) UndoAll(); bPrevCaseSensitive = bCaseSensitive; } Filter(PrevPattern, bPrevCaseSensitive); Info.AdvControl(&PluginId, ACTL_REDRAWALL, 0, NULL); break; case DN_EDITCHANGE: DialogItem.Size = (size_t)Info.SendDlgMessage(hDlg, DM_GETDLGITEM, ixSearchString, NULL); DialogItem.Item = (FarDialogItem*)malloc(DialogItem.Size); if (DialogItem.Item) { Info.SendDlgMessage(hDlg, DM_GETDLGITEM, ixSearchString, &DialogItem); size_t nChars = wcslen(DialogItem.Item->Data); size_t nPrevChars = Length(PrevPattern); bool bFilter = true; if (PrevPattern!=NULL) { //получается ли новая строка укорачиванием старой на символ if (bSequentialInput && nChars+1 == nPrevChars && wcsncmp(DialogItem.Item->Data, PrevPattern, nChars) == 0) { //да - откатываем одну правку Undo(); bFilter = false; } else { //получается ли новая строка добавлением символа к старой if (!(nChars == nPrevChars+1 && wcsncmp(DialogItem.Item->Data, PrevPattern, nPrevChars) == 0)) { //если нет - считаем, что откатывать по одной правке нельзя bSequentialInput = false; } //можно ли искать новую строку среди уже отфильтрованных if (wcsstr(DialogItem.Item->Data, PrevPattern) == NULL) { //нет - откатываем все правки UndoAll(); } } } //выделить контекст заново при необходимости if (Length(PrevPattern)<MAX_PATTERN_LEN && nChars>=MAX_PATTERN_LEN) { SearchFree(ctx); ctx = SearchHAlloc(); } else if (Length(PrevPattern)>=MAX_PATTERN_LEN && nChars<MAX_PATTERN_LEN) { SearchHFree(ctx); ctx = SearchAlloc(); } //запомнить значение фильтра if (nChars!=0) { SetLength(&PrevPattern, (int)nChars); wcscpy(PrevPattern, DialogItem.Item->Data); } else { SetLength(&PrevPattern, 0); bSequentialInput = true; } free(DialogItem.Item); if (bFilter) Filter(PrevPattern, bPrevCaseSensitive); Info.AdvControl(&PluginId, ACTL_REDRAWALL, 0, NULL); } break; } return Info.DefDlgProc(hDlg, Msg, Param1, Param2); }
static intptr_t GetCheck(HANDLE hDlg, intptr_t i) { return (intptr_t)Info.SendDlgMessage(hDlg, DM_GETCHECK, i, 0); }
static intptr_t WINAPI MainDialogProc(HANDLE hDlg,intptr_t Msg,intptr_t Param1,void* Param2) { BoardParams* DlgParams=(BoardParams*)Info.SendDlgMessage(hDlg,DM_GETDLGDATA,0,0); //if(Msg==DN_KEY&&Param2==KEY_ENTER) return TRUE; switch(Msg) { case DN_INITDIALOG: Info.SendDlgMessage(hDlg,DM_RESETBOARD,0,0); SetFocus(true); break; case DN_CONTROLINPUT: { const INPUT_RECORD* record=(const INPUT_RECORD*)Param2; if(record->EventType==KEY_EVENT&&record->Event.KeyEvent.bKeyDown) { KillFocus(); if(IsNone(record)) { switch(record->Event.KeyEvent.wVirtualKeyCode) { case VK_UP: DlgParams->curr_col--; break; case VK_DOWN: DlgParams->curr_col++; break; case VK_LEFT: DlgParams->curr_row--; break; case VK_RIGHT: DlgParams->curr_row++; break; case VK_HOME: DlgParams->curr_row=0; break; case VK_END: DlgParams->curr_row=DlgParams->width-1; break; case VK_PRIOR: DlgParams->curr_col=0; break; case VK_NEXT: DlgParams->curr_col=DlgParams->height-1; break; case L' ': { Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,FALSE,0); if(!DlgParams->finished) { if(!DlgParams->started) Info.SendDlgMessage(hDlg,DM_START_GAME,0,0); OpenPlace(hDlg,DlgParams,DlgParams->curr_row,DlgParams->curr_col,COP_CHECK_ALL); } Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,TRUE,0); } break; case VK_DELETE: { Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,FALSE,0); if(!DlgParams->finished) { FarDialogItem DialogItem; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,DlgParams->width*DlgParams->curr_col+DlgParams->curr_row,&DialogItem); switch(GET_DATA_1(DialogItem)) { case STATE_CLOSE: SET_DATA_1(DialogItem,STATE_MARKED); DlgParams->curr_mines++; break; case STATE_OPEN: break; case STATE_MARKED: SET_DATA_1(DialogItem,STATE_CLOSE); DlgParams->curr_mines--; break; } Info.SendDlgMessage(hDlg,DM_SETDLGITEMSHORT,DlgParams->width*DlgParams->curr_col+DlgParams->curr_row,&DialogItem); Info.SendDlgMessage(hDlg,DM_SHOWTIME,0,0); } Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,TRUE,0); } break; case VK_F2: DlgParams->started=false; DlgParams->finished=FINISH_NO; Info.SendDlgMessage(hDlg,DM_SETTEXTPTR,DlgParams->width*DlgParams->height,const_cast<wchar_t*>(GetMsg(mStart))); Info.SendDlgMessage(hDlg,DM_RESETBOARD,0,0); break; case VK_F3: { wchar_t ScoreKeyName[1024],PlayerKeyName[1024]; FSF.sprintf(ScoreKeyName,L"Score_%d_%d_%d",DlgParams->width,DlgParams->height,DlgParams->mines); FSF.sprintf(PlayerKeyName,L"Player_%d_%d_%d",DlgParams->width,DlgParams->height,DlgParams->mines); CFarSettings settings(MainGuid); __int64 Score; wchar_t Name[512]; Score=settings.Get(ScoreKeyName,-1); if(!settings.Get(PlayerKeyName,Name,sizeofa(Name))) Name[0]=0; if(Score>=0&&Name[0]) { wchar_t buffer[1024]; FSF.sprintf(buffer,GetMsg(mHighscoreFormat),Name,(long)Score); const wchar_t* MsgItems[]={GetMsg(mHighscoreTitle),buffer,GetMsg(mOk)}; Info.Message(&MainGuid,&HiscoreGuid,0,NULL,MsgItems,sizeofa(MsgItems),1); } } break; } } if(DlgParams->curr_row>=DlgParams->width) DlgParams->curr_row=0; if(DlgParams->curr_row<0) DlgParams->curr_row=DlgParams->width-1; if(DlgParams->curr_col>=DlgParams->height) DlgParams->curr_col=0; if(DlgParams->curr_col<0) DlgParams->curr_col=DlgParams->height-1; SetFocus(true); Info.SendDlgMessage(hDlg,DM_REDRAW,0,0); } else if(record->EventType==MOUSE_EVENT) { DWORD Buttons=record->Event.MouseEvent.dwButtonState; if(Buttons&FROM_LEFT_1ST_BUTTON_PRESSED) RunKey(L"Keys([[Space]])"); else if(Buttons&RIGHTMOST_BUTTON_PRESSED) RunKey(L"Keys([[Del]])"); } } break; case DN_GOTFOCUS: SetFocus(false); break; case DN_KILLFOCUS: KillFocus(); break; case DM_RESETBOARD: { int curr_mines=DlgParams->mines,color; FarDialogItem DialogItem; Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,FALSE,0); for(int i=0;i<DlgParams->height;i++) for(int j=0;j<DlgParams->width;j++) { int k=i*DlgParams->width+j; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,k,&DialogItem); SET_DATA_0(DialogItem,0); SET_DATA_1(DialogItem,0); color=0; DialogItem.VBuf[1].Char=GetChar(GET_DATA_0(DialogItem),GET_DATA_1(DialogItem),&color); int bgcolor=GetBG(i,j,STATE_CLOSE); DialogItem.VBuf[0].Attributes.ForegroundColor=DialogItem.VBuf[1].Attributes.ForegroundColor=DialogItem.VBuf[2].Attributes.ForegroundColor=color; DialogItem.VBuf[0].Attributes.BackgroundColor=DialogItem.VBuf[1].Attributes.BackgroundColor=DialogItem.VBuf[2].Attributes.BackgroundColor=bgcolor; Info.SendDlgMessage(hDlg,DM_SETDLGITEMSHORT,k,&DialogItem); } //set mines while(curr_mines) for(int i=0;i<DlgParams->height;i++) for(int j=0;j<DlgParams->width;j++) { int k=i*DlgParams->width+j; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,k,&DialogItem); if(curr_mines&&(!GET_DATA_0(DialogItem))) { if(rand()<=(RAND_MAX*DlgParams->mines/(DlgParams->width*DlgParams->height))) { curr_mines--; SET_DATA_0(DialogItem,9); Info.SendDlgMessage(hDlg,DM_SETDLGITEMSHORT,k,&DialogItem); } } } //set places for(int i=0;i<DlgParams->height;i++) for(int j=0;j<DlgParams->width;j++) { int k=i*DlgParams->width+j; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,k,&DialogItem); if(GET_DATA_0(DialogItem)==0) { SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j-1,i-1,hDlg,DlgParams,false)); SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j-1,i,hDlg,DlgParams,false)); SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j-1,i+1,hDlg,DlgParams,false)); SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j,i-1,hDlg,DlgParams,false)); SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j,i+1,hDlg,DlgParams,false)); SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j+1,i-1,hDlg,DlgParams,false)); SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j+1,i,hDlg,DlgParams,false)); SET_DATA_0(DialogItem,GET_DATA_0(DialogItem)+GetMine(j+1,i+1,hDlg,DlgParams,false)); Info.SendDlgMessage(hDlg,DM_SETDLGITEMSHORT,k,&DialogItem); } } DlgParams->curr_mines=0; Info.SendDlgMessage(hDlg,DM_SHOWTIME,0,0); Info.SendDlgMessage(hDlg,DM_ENABLEREDRAW,TRUE,0); } break; case DN_ENTERIDLE: Info.SendDlgMessage(hDlg,DM_SHOWTIME,0,0); break; case DM_SHOWTIME: { wchar_t buffer[1024]; DWORD diff_time=DlgParams->started?((DlgParams->finished?DlgParams->end_time:GetTickCount())-DlgParams->start_time)/1000:0; FSF.sprintf(buffer,GetMsg(mTime),diff_time,DlgParams->curr_mines); Info.SendDlgMessage(hDlg,DM_SETTEXTPTR,DlgParams->width*DlgParams->height+1,buffer); } break; case DM_START_GAME: Info.SendDlgMessage(hDlg,DM_SETTEXTPTR,DlgParams->width*DlgParams->height,const_cast<wchar_t*>(GetMsg(mGame))); DlgParams->started=true; DlgParams->start_time=GetTickCount(); break; } return Info.DefDlgProc(hDlg,Msg,Param1,Param2); }
static void CheckStop(HANDLE hDlg,BoardParams *DlgParams,int row,int col) { if(DlgParams->finished!=FINISH_NO) return; FarDialogItem DialogItem; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,DlgParams->width*col+row,&DialogItem); if(GET_DATA_1(DialogItem)==STATE_OPEN&&GET_DATA_0(DialogItem)==9) { Info.SendDlgMessage(hDlg,DM_SETTEXTPTR,DlgParams->width*DlgParams->height,const_cast<wchar_t*>(GetMsg(mLose))); DlgParams->finished=FINISH_LOSE; DlgParams->end_time=GetTickCount(); Beep((long)Opt.LoseFreq,100); Info.SendDlgMessage(hDlg,DM_SHOWTIME,0,NULL); } else { FarDialogItem DialogItem; bool won=true; for(int i=0;i<DlgParams->height;i++) { for(int j=0;j<DlgParams->width;j++) { int k=i*DlgParams->width+j; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,k,&DialogItem); if(GET_DATA_1(DialogItem)==STATE_CLOSE&&GET_DATA_0(DialogItem)<9) //FIXME { won=false; break; } else if(GET_DATA_1(DialogItem)==STATE_MARKED&&GET_DATA_0(DialogItem)<9) { won=false; break; } else if(GET_DATA_1(DialogItem)==STATE_OPEN&&GET_DATA_0(DialogItem)==9) { won=false; break; } } if(!won) break; } if(won) { Info.SendDlgMessage(hDlg,DM_SETTEXTPTR,DlgParams->width*DlgParams->height,const_cast<wchar_t*>(GetMsg(mWon))); DlgParams->finished=FINISH_WON; DlgParams->end_time=GetTickCount(); DlgParams->curr_mines=DlgParams->mines; Beep((long)Opt.WonFreq,100); int color; for(int i=0;i<DlgParams->height;i++) for(int j=0;j<DlgParams->width;j++) { int k=i*DlgParams->width+j; Info.SendDlgMessage(hDlg,DM_GETDLGITEMSHORT,k,&DialogItem); if(GET_DATA_1(DialogItem)==STATE_CLOSE) { SET_DATA_1(DialogItem,STATE_MARKED); DialogItem.VBuf[1].Char=GetChar(GET_DATA_0(DialogItem),GET_DATA_1(DialogItem),&color); int bgcolor=GetBG(i,j,GET_DATA_1(DialogItem)); DialogItem.VBuf[0].Attributes.ForegroundColor=DialogItem.VBuf[1].Attributes.ForegroundColor=DialogItem.VBuf[2].Attributes.ForegroundColor=color; DialogItem.VBuf[0].Attributes.BackgroundColor=DialogItem.VBuf[1].Attributes.BackgroundColor=DialogItem.VBuf[2].Attributes.BackgroundColor=bgcolor; Info.SendDlgMessage(hDlg,DM_SETDLGITEMSHORT,k,&DialogItem); } } Info.SendDlgMessage(hDlg,DM_SHOWTIME,0,0); SubmitScore(DlgParams); } } }
static intptr_t WINAPI MainDialogProc(HANDLE hDlg,intptr_t Msg,intptr_t Param1,void* Param2) { switch(Msg) { case DN_INITDIALOG: Info.SendDlgMessage(hDlg,DM_LISTBOXEX_INIT,1,0); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("aaa")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("1 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("2 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("3 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("4 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("5 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("6 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("7 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("8 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("9 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("0 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("1 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("2 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("3 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("4 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("5 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("6 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("7 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("8 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("9 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("0 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("1 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("2 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("3 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("4 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("5 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("6 bbb")); Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ADDSTR,1,(void*)_T("7 bbb")); { ListBoxExSetColor color={2,LISTBOXEX_COLORS_ITEM,0,{{FCF_FG_4BIT|FCF_BG_4BIT,0xC,0x7,NULL},0,false}}; for(int i=2;i<5;i++) { color.ColorIndex=i; Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ITEM_SETCOLOR,1,&color); } color.Color.Color.ForegroundColor=0xA; color.Color.Color.BackgroundColor=0x7; for(int i=7;i<10;i++) { color.ColorIndex=i; Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ITEM_SETCOLOR,1,&color); } color.Color.Color.ForegroundColor=0x9; color.Color.Color.BackgroundColor=0x7; for(int i=12;i<15;i++) { color.ColorIndex=i; Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ITEM_SETCOLOR,1,&color); } color.Color.Color.ForegroundColor=0x9; color.Color.Color.BackgroundColor=0x0; color.TypeIndex=LISTBOXEX_COLORS_SELECTED; for(int i=12;i<15;i++) { color.ColorIndex=i; Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ITEM_SETCOLOR,1,&color); } ListBoxExSetHotkey hotkey={16,'a'}; Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ITEM_SETHOTKEY,1,&hotkey); } break; case DN_CONTROLINPUT: { const INPUT_RECORD* record=(const INPUT_RECORD *)Param2; if(record->EventType==KEY_EVENT&&record->Event.KeyEvent.bKeyDown) { WORD vk=record->Event.KeyEvent.wVirtualKeyCode; if(IsNone(record)) { switch(vk) { case VK_DELETE: { FarListDelete list={sizeof(FarListDelete),3,4}; Info.SendDlgMessage(hDlg,DM_LISTBOXEX_DELETE,1,&list); } break; case VK_F2: { ListBoxExSetFlags flags={Info.SendDlgMessage(hDlg,DM_LISTBOXEX_GETCURPOS,1,0L),LIFEX_DISABLE}; Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ITEM_SETFLAGS,1,&flags); } break; case VK_F3: { ListBoxExSetFlags flags={Info.SendDlgMessage(hDlg,DM_LISTBOXEX_GETCURPOS,1,0L)-1,0}; Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ITEM_SETFLAGS,1,&flags); } break; case VK_INSERT: Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ITEM_TOGGLE,1,(void*)Info.SendDlgMessage(hDlg,DM_LISTBOXEX_GETCURPOS,1,0L)); break; } } else if(IsShift(record)) { switch(vk) { case VK_DELETE: { ListBoxExSetFlags flags={Info.SendDlgMessage(hDlg,DM_LISTBOXEX_GETCURPOS,1,0L),LIFEX_HIDDEN}; Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ITEM_SETFLAGS,1,&flags); } break; } } else if(IsCtrl(record)) { switch(vk) { case VK_UP: { FarListPos pos={sizeof(FarListPos),Info.SendDlgMessage(hDlg,DM_LISTBOXEX_GETCURPOS,1,0L),-1}; Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ITEM_MOVE_UP,1,(void*)(INT_PTR)pos.SelectPos); pos.SelectPos--; Info.SendDlgMessage(hDlg,DM_LISTBOXEX_SETCURPOS,1,&pos); } break; case VK_DOWN: { FarListPos pos={sizeof(FarListPos),Info.SendDlgMessage(hDlg,DM_LISTBOXEX_GETCURPOS,1,0L),-1}; Info.SendDlgMessage(hDlg,DM_LISTBOXEX_ITEM_MOVE_DOWN,1,(void*)(INT_PTR)pos.SelectPos); pos.SelectPos++; Info.SendDlgMessage(hDlg,DM_LISTBOXEX_SETCURPOS,1,&pos); } break; } } } } break; case DN_CLOSE: Info.SendDlgMessage(hDlg,DM_LISTBOXEX_FREE,1,0); break; case DM_LISTBOXEX_ISLBE: if(Param1==1) return TRUE; return FALSE; } return ListBoxExDialogProc(hDlg,Msg,Param1,Param2); }