|
|
1.1 ! root 1: /* ! 2: Hatari ! 3: ! 4: This is normal 'C' code to handle our options dialog. We keep all our configuration details ! 5: in a variable 'ConfigureParams'. When we open our dialog we copy this and then when we 'OK' ! 6: or 'Cancel' the dialog we can compare and makes the necessary changes. As the 'ConfigureParams' ! 7: is always up to date this is where we load/save data to the registry. ! 8: */ ! 9: ! 10: #include "main.h" ! 11: #include "configuration.h" ! 12: #include "audio.h" ! 13: #include "debug.h" ! 14: #include "dialog.h" ! 15: #include "file.h" ! 16: #include "floppy.h" ! 17: #include "reset.h" ! 18: #include "joy.h" ! 19: #include "keymap.h" ! 20: #include "m68000.h" ! 21: #include "memAlloc.h" ! 22: #include "memorySnapShot.h" ! 23: #include "misc.h" ! 24: #include "printer.h" ! 25: #include "rs232.h" ! 26: #include "screen.h" ! 27: #include "sound.h" ! 28: #include "tos.h" ! 29: #include "vdi.h" ! 30: #include "video.h" ! 31: #include "view.h" ! 32: ! 33: ! 34: ! 35: DLG_PARAMS ConfigureParams,DialogParams; /* List of configuration for system and dialog(so can choose 'Cancel') */ ! 36: BOOL bOKDialog; /* Did user 'OK' dialog? */ ! 37: int nLastOpenPage = 0; /* Last property page opened(so can re-open on this next time) */ ! 38: ! 39: ! 40: //----------------------------------------------------------------------- ! 41: /* ! 42: Check if need to warn user that changes will take place after reset ! 43: Return TRUE if wants to reset ! 44: */ ! 45: /* ! 46: BOOL Dialog_DoNeedReset(void) ! 47: { ! 48: // Did we change colour/mono monitor? If so, must reset ! 49: if (ConfigureParams.Screen.bUseHighRes!=DialogParams.Screen.bUseHighRes) ! 50: return(TRUE); ! 51: // Did change to GEM VDI display? ! 52: if (ConfigureParams.TOSGEM.bUseExtGEMResolutions!=DialogParams.TOSGEM.bUseExtGEMResolutions) ! 53: return(TRUE); ! 54: // Did change GEM resolution or colour depth? ! 55: if ( (ConfigureParams.TOSGEM.nGEMResolution!=DialogParams.TOSGEM.nGEMResolution) ! 56: || (ConfigureParams.TOSGEM.nGEMColours!=DialogParams.TOSGEM.nGEMColours) ) ! 57: return(TRUE); ! 58: ! 59: return(FALSE); ! 60: } ! 61: */ ! 62: ! 63: //----------------------------------------------------------------------- ! 64: /* ! 65: Copy details back to configuration and perform reset ! 66: */ ! 67: /* ! 68: void Dialog_CopyDialogParamsToConfiguration(BOOL bForceReset) ! 69: { ! 70: BOOL NeedReset; ! 71: ! 72: // Do we need to warn user of that changes will only take effect after reset? ! 73: if (bForceReset) ! 74: NeedReset = bForceReset; ! 75: else ! 76: NeedReset = Dialog_DoNeedReset(); ! 77: ! 78: // Do need to change DirectX resolution? Need if change display/overscan settings (if switch between Colour/Mono cause reset later) ! 79: if (bInFullScreen) { ! 80: if ( (DialogParams.Screen.ChosenDisplayMode!=ConfigureParams.Screen.ChosenDisplayMode) ! 81: || (DialogParams.Screen.Advanced.bAllowOverscan!=ConfigureParams.Screen.Advanced.bAllowOverscan) ) { ! 82: Screen_ReturnFromFullScreen(); ! 83: ConfigureParams.Screen.ChosenDisplayMode = DialogParams.Screen.ChosenDisplayMode; ! 84: ConfigureParams.Screen.Advanced.bAllowOverscan = DialogParams.Screen.Advanced.bAllowOverscan; ! 85: Screen_EnterFullScreen(); ! 86: } ! 87: } ! 88: // Did set new printer parameters? ! 89: if ( (DialogParams.Printer.bEnablePrinting!=ConfigureParams.Printer.bEnablePrinting) ! 90: || (DialogParams.Printer.bPrintToFile!=ConfigureParams.Printer.bPrintToFile) ! 91: || (stricmp(DialogParams.Printer.szPrintToFileName,ConfigureParams.Printer.szPrintToFileName)) ) ! 92: Printer_CloseAllConnections(); ! 93: // Did set new RS232 parameters? ! 94: if ( (DialogParams.RS232.bEnableRS232!=ConfigureParams.RS232.bEnableRS232) ! 95: || (DialogParams.RS232.nCOMPort!=ConfigureParams.RS232.nCOMPort) ) ! 96: RS232_CloseCOMPort(); ! 97: // Did stop sound? Or change playback Hz. If so, also stop sound recording ! 98: if ( (!DialogParams.Sound.bEnableSound) || (DialogParams.Sound.nPlaybackQuality!=ConfigureParams.Sound.nPlaybackQuality) ) { ! 99: if (Sound_AreWeRecording()) ! 100: Sound_EndRecording(NULL); ! 101: } ! 102: ! 103: // Copy details to configuration, so can be saved out or set on reset ! 104: ConfigureParams = DialogParams; ! 105: // And write to configuration now, so don't loose ! 106: Configuration_UnInit(); ! 107: ! 108: // Copy details to global, if we reset copy them all ! 109: Dialog_CopyDetailsFromConfiguration(NeedReset); ! 110: // Set keyboard remap file ! 111: Keymap_LoadRemapFile(ConfigureParams.Keyboard.szMappingFileName); ! 112: // Set new sound playback rate ! 113: DAudio_ReCreateDirectSoundBuffer(); ! 114: // Resize window if need ! 115: if (!ConfigureParams.TOSGEM.bUseExtGEMResolutions) ! 116: View_ResizeWindowToFull(); ! 117: ! 118: // Do we need to perform reset? ! 119: if (NeedReset) { ! 120: Reset_Cold(); ! 121: Main_UnPauseEmulation(); ! 122: View_ToggleWindowsMouse(MOUSE_ST); ! 123: } ! 124: ! 125: // Go into/return from full screen if flagged ! 126: if ( (!bInFullScreen) && (DialogParams.Screen.bFullScreen) ) ! 127: Screen_EnterFullScreen(); ! 128: else if ( bInFullScreen && (!DialogParams.Screen.bFullScreen) ) ! 129: Screen_ReturnFromFullScreen(); ! 130: } ! 131: */ ! 132: ! 133: //----------------------------------------------------------------------- ! 134: /* ! 135: Default elements of configuration structure ! 136: */ ! 137: /* ! 138: void Dialog_DefaultConfigurationDetails(void) ! 139: { ! 140: // Clear parameters ! 141: Memory_Clear(&ConfigureParams,sizeof(DLG_PARAMS)); ! 142: ! 143: // Set defaults ! 144: Dialog_Configure_SetDefaults(); ! 145: Dialog_Screen_SetDefaults(); ! 146: Dialog_Joysticks_SetDefaults(); ! 147: Dialog_Keyboard_SetDefaults(); ! 148: Dialog_Sound_SetDefaults(); ! 149: Dialog_Memory_SetDefaults(); ! 150: Dialog_DiscImage_SetDefaults(); ! 151: Dialog_HardDisc_SetDefaults(); ! 152: Dialog_TOSGEM_SetDefaults(); ! 153: Dialog_RS232_SetDefaults(); ! 154: Dialog_Printer_SetDefaults(); ! 155: Dialog_Favourites_SetDefaults(); ! 156: } ! 157: */ ! 158: ! 159: //----------------------------------------------------------------------- ! 160: /* ! 161: Copy details from configuration structure into global variables for system ! 162: */ ! 163: /* ! 164: void Dialog_CopyDetailsFromConfiguration(BOOL bReset) ! 165: { ! 166: // Set new timer thread ! 167: Main_SetSpeedThreadTimer(ConfigureParams.Configure.nMinMaxSpeed); ! 168: // Set resolution change ! 169: if (bReset) { ! 170: bUseVDIRes = ConfigureParams.TOSGEM.bUseExtGEMResolutions; ! 171: bUseHighRes = ConfigureParams.Screen.bUseHighRes || (bUseVDIRes && (ConfigureParams.TOSGEM.nGEMColours==GEMCOLOUR_2)); ! 172: VDI_SetResolution(VDIModeOptions[ConfigureParams.TOSGEM.nGEMResolution],ConfigureParams.TOSGEM.nGEMColours); ! 173: } ! 174: // Set playback frequency ! 175: DAudio_SetOutputAudioFreq(ConfigureParams.Sound.nPlaybackQuality); ! 176: ! 177: // Remove back-slashes, etc.. from names ! 178: File_CleanFileName(ConfigureParams.TOSGEM.szTOSImageFileName); ! 179: } ! 180: */ ! 181: ! 182: //----------------------------------------------------------------------- ! 183: /* ! 184: Open Property sheet Options dialog ! 185: Return TRUE is use chose OK, or FALSE if cancel! ! 186: */ ! 187: /* ! 188: BOOL Dialog_DoProperty(int StartingPage,BOOL bForceReset) ! 189: { ! 190: PROPSHEETPAGE psp[NUM_PROPERTY_PAGES]; ! 191: PROPSHEETHEADER psh; ! 192: int i; ! 193: ! 194: // Copy details to DialogParams(this is so can restore if 'Cancel' dialog) ! 195: ConfigureParams.Screen.bFullScreen = bInFullScreen; ! 196: DialogParams = ConfigureParams; ! 197: ! 198: // Create property pages for dialog ! 199: for(i=0; i<NUM_PROPERTY_PAGES; i++) { ! 200: psp[i].dwSize = sizeof(PROPSHEETPAGE); ! 201: psp[i].dwFlags = PSP_USETITLE | PSP_HASHELP; ! 202: psp[i].hInstance = hInst; ! 203: psp[i].pszTemplate = MAKEINTRESOURCE(DialogPages[i].PageIDD); ! 204: psp[i].pszIcon = NULL; ! 205: psp[i].pfnDlgProc = DialogPages[i].pDlgProc; ! 206: psp[i].pszTitle = DialogPages[i].pTitle; ! 207: psp[i].lParam = 0; ! 208: psp[i].pfnCallback = NULL; ! 209: } ! 210: ! 211: // Set up property page ! 212: psh.dwSize = sizeof(PROPSHEETHEADER); ! 213: psh.dwFlags = PSH_PROPSHEETPAGE | PSH_NOAPPLYNOW | PSH_HASHELP | PSH_USECALLBACK; ! 214: psh.hwndParent = hWnd; ! 215: psh.hInstance = hInst; ! 216: psh.pszIcon = NULL; ! 217: psh.pszCaption = (LPSTR)"Hatari Options"; ! 218: psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE); ! 219: psh.nStartPage = StartingPage; ! 220: psh.ppsp = (LPCPROPSHEETPAGE)&psp; ! 221: psh.pfnCallback = Dialog_PropertyCallBack; // Callback to store of window handle ! 222: ! 223: // Clear handles(used to access other pages of dialog from another) ! 224: Dialog_Configure_ClearHandle(); ! 225: Dialog_Screen_ClearHandle(); ! 226: Dialog_Sound_ClearHandle(); ! 227: ! 228: bOKDialog = FALSE; // Reset OK flag ! 229: bSaveMemoryState = FALSE; ! 230: bRestoreMemoryState = FALSE; ! 231: PropertySheet(&psh); ! 232: ! 233: // Copy details to configuration, and ask user if wishes to reset ! 234: if (bOKDialog) ! 235: Dialog_CopyDialogParamsToConfiguration(bForceReset); ! 236: // Did want to save/restore memory save? If did, need to re-enter emulation mode so can save in 'safe-zone' ! 237: if (bSaveMemoryState || bRestoreMemoryState) { ! 238: // Back into emulation mode, when next VBL occurs state will be safed - otherwise registers are unknown ! 239: View_ToggleWindowsMouse(MOUSE_ST); ! 240: } ! 241: ! 242: return(bOKDialog); ! 243: } ! 244: */ ! 245: ! 246: //----------------------------------------------------------------------- ! 247: /* ! 248: Simple call back to store off hWnd of Property sheet dialog so can choose 'OK' when dbl-click Favourites ! 249: */ ! 250: /* ! 251: BOOL CALLBACK Dialog_PropertyCallBack(HWND hDlg,UINT wParam, LONG lParam) ! 252: { ! 253: // Just store, handle when Initialised ! 254: PropHWnd = hDlg; ! 255: ! 256: return(FALSE); ! 257: } ! 258: */ ! 259: ! 260: //----------------------------------------------------------------------- ! 261: /* ! 262: Set status of dialog button using flag ! 263: */ ! 264: /* ! 265: void Dialog_SetButton(HWND hDlg,int ButtonID,int Flag) ! 266: { ! 267: if (hDlg) { ! 268: if (Flag) ! 269: CheckDlgButton(hDlg,ButtonID,BST_CHECKED); ! 270: else ! 271: CheckDlgButton(hDlg,ButtonID,BST_UNCHECKED); ! 272: } ! 273: } ! 274: */ ! 275: ! 276: //----------------------------------------------------------------------- ! 277: /* ! 278: Read status of dialog button ! 279: */ ! 280: /* ! 281: BOOL Dialog_ReadButton(HWND hDlg,int ButtonID) ! 282: { ! 283: if (IsDlgButtonChecked(hDlg,ButtonID)==BST_CHECKED) ! 284: return(TRUE); ! 285: else ! 286: return(FALSE); ! 287: } ! 288: ! 289: //----------------------------------------------------------------------- ! 290: /* ! 291: Enable dialog item ! 292: */ ! 293: /* ! 294: void Dialog_EnableItem(HWND hDlg,int ButtonID,int State) ! 295: { ! 296: EnableWindow(GetDlgItem(hDlg,ButtonID),State); ! 297: } ! 298: */ ! 299: ! 300: //----------------------------------------------------------------------- ! 301: /* ! 302: Enable dialog items ! 303: */ ! 304: /* ! 305: void Dialog_EnableItems(HWND hDlg,int *pButtonIDs,int State) ! 306: { ! 307: int i=0; ! 308: ! 309: // Enable each button in list ! 310: while(pButtonIDs[i]) { ! 311: Dialog_EnableItem(hDlg,pButtonIDs[i],State); ! 312: i++; ! 313: } ! 314: } ! 315: */ ! 316: ! 317: //----------------------------------------------------------------------- ! 318: /* ! 319: Show dialog items, in range(ie controls all have consecutive IDs - dodgy very very handy!) ! 320: */ ! 321: /* ! 322: void Dialog_ShowItemRange(HWND hDlg,int LowButtonID,int HighButtonID,int Show) ! 323: { ! 324: int i; ! 325: ! 326: for(i=LowButtonID; i<=HighButtonID; i++) ! 327: ShowWindow(GetDlgItem(hDlg,i),Show); ! 328: } ! 329: */ ! 330: ! 331: //----------------------------------------------------------------------- ! 332: /* ! 333: Set text item in dialog ! 334: */ ! 335: /* ! 336: void Dialog_SetText(HWND hDlg,int ButtonID,char *szString) ! 337: { ! 338: SendDlgItemMessage(hDlg,ButtonID,WM_SETTEXT,0,(LPARAM)szString); ! 339: } ! 340: */ ! 341: ! 342: //----------------------------------------------------------------------- ! 343: /* ! 344: Read text item from dialog ! 345: */ ! 346: /* ! 347: void Dialog_ReadText(HWND hDlg,int ButtonID,char *szString) ! 348: { ! 349: SendDlgItemMessage(hDlg,ButtonID,WM_GETTEXT,1024,(LPARAM)szString); ! 350: } ! 351: */ ! 352: ! 353: //----------------------------------------------------------------------- ! 354: /* ! 355: Set Trackbar control range and select ! 356: */ ! 357: /* ! 358: void Dialog_SetTrackBar(HWND hDlg, int nTrackBarID, int nMin, int nMax, int nSelected) ! 359: { ! 360: SendDlgItemMessage(hDlg,nTrackBarID,TBM_SETRANGE,TRUE,(LPARAM)MAKELONG(nMin,nMax)); ! 361: SendDlgItemMessage(hDlg,nTrackBarID,TBM_SETPOS,TRUE,(LPARAM)nSelected); ! 362: } ! 363: */ ! 364: ! 365: //----------------------------------------------------------------------- ! 366: /* ! 367: Read Trackbar control selection ! 368: */ ! 369: /* ! 370: int Dialog_GetTrackBar(HWND hDlg, int nTrackBarID) ! 371: { ! 372: int nSelectedItem; ! 373: ! 374: // Read selected item, if error default to first item in list ! 375: nSelectedItem = SendDlgItemMessage(hDlg,nTrackBarID,TBM_GETPOS,0,(LONG)0); ! 376: if (nSelectedItem==CB_ERR) ! 377: nSelectedItem = 0; ! 378: ! 379: return(nSelectedItem); ! 380: } ! 381: */ ! 382: ! 383: //----------------------------------------------------------------------- ! 384: /* ! 385: Add string items to a Combo Box ! 386: */ ! 387: /* ! 388: void Dialog_SetComboBoxItems(HWND hDlg, int ComboBoxID, char *pComboBoxStrings[], int nSelectedItem) ! 389: { ! 390: int i=0; ! 391: ! 392: // Reset items ! 393: SendDlgItemMessage(hDlg,ComboBoxID,CB_RESETCONTENT,0,(LONG)0); ! 394: // Add items strings ! 395: while(pComboBoxStrings[i]) { ! 396: if (strlen(pComboBoxStrings[i])>0) ! 397: SendDlgItemMessage(hDlg,ComboBoxID,CB_ADDSTRING,0,(LONG)pComboBoxStrings[i]); ! 398: i++; ! 399: } ! 400: ! 401: // And select chosen item ! 402: SendDlgItemMessage(hDlg,ComboBoxID,CB_SETCURSEL,nSelectedItem,(LONG)0); ! 403: } ! 404: */ ! 405: ! 406: //----------------------------------------------------------------------- ! 407: /* ! 408: Select string items in a Combo Box ! 409: */ ! 410: /* ! 411: void Dialog_ComboBoxSelectString(HWND hDlg, int ComboBoxID, char *pszSelectedString) ! 412: { ! 413: // And select chosen item ! 414: SendDlgItemMessage(hDlg,ComboBoxID,CB_SELECTSTRING,0,(LONG)pszSelectedString); ! 415: } ! 416: */ ! 417: ! 418: //----------------------------------------------------------------------- ! 419: /* ! 420: Read selected item index from a Combo Box ! 421: */ ! 422: /* ! 423: int Dialog_GetSelectedComboBoxItem(HWND hDlg, int ComboBoxID) ! 424: { ! 425: int nSelectedItem; ! 426: ! 427: // Read selected item, if error default to first item in list ! 428: nSelectedItem = SendDlgItemMessage(hDlg,ComboBoxID,CB_GETCURSEL,0,(LONG)0); ! 429: if (nSelectedItem==CB_ERR) ! 430: nSelectedItem = 0; ! 431: ! 432: return(nSelectedItem); ! 433: } ! 434: */ ! 435: //----------------------------------------------------------------------- ! 436: /* ! 437: Add string items to a List Box ! 438: */ ! 439: /* ! 440: void Dialog_SetListBoxItems(HWND hDlg, int ListBoxID, char *pListBoxStrings[], int nSelectedItem) ! 441: { ! 442: int i=0; ! 443: ! 444: // Reset items ! 445: SendDlgItemMessage(hDlg,ListBoxID,LB_RESETCONTENT,0,(LONG)0); ! 446: // Add items strings ! 447: while(pListBoxStrings[i]) { ! 448: SendDlgItemMessage(hDlg,ListBoxID,LB_ADDSTRING,0,(LONG)pListBoxStrings[i]); ! 449: i++; ! 450: } ! 451: ! 452: // And select chosen item ! 453: SendDlgItemMessage(hDlg,ListBoxID,LB_SETCURSEL,nSelectedItem,(LONG)0); ! 454: } ! 455: */ ! 456: ! 457: //----------------------------------------------------------------------- ! 458: /* ! 459: Read selected item index from a List Box ! 460: */ ! 461: /* ! 462: int Dialog_GetSelectedListBoxItem(HWND hDlg, int ListBoxID) ! 463: { ! 464: int nSelectedItem; ! 465: ! 466: // Read selected item, if error default to first item in list ! 467: nSelectedItem = SendDlgItemMessage(hDlg,ListBoxID,LB_GETCURSEL,0,(LONG)0); ! 468: if (nSelectedItem==LB_ERR) ! 469: nSelectedItem = 0; ! 470: ! 471: return(nSelectedItem); ! 472: } ! 473: */ ! 474: ! 475: //----------------------------------------------------------------------- ! 476: /* ! 477: Set Spin control range and select item ! 478: */ ! 479: /* ! 480: int Dialog_SetSpinList(HWND hDlg, int nEditBoxID, int nSpinID, char *pSpinStrings[], int nItems, int nSelectedItem) ! 481: { ! 482: // Limit selection ! 483: nSelectedItem = Misc_LimitInt(nSelectedItem, 0,nItems-1); ! 484: ! 485: // Fill text with selected item ! 486: Dialog_SetText(hDlg,nEditBoxID,pSpinStrings[nSelectedItem]); ! 487: // Set range and selection of Spin control ! 488: if (nItems==1) { ! 489: Dialog_EnableItem(hDlg,nSpinID,FALSE); ! 490: } ! 491: else { ! 492: SendDlgItemMessage(hDlg,nSpinID,UDM_SETRANGE,0,(LPARAM)MAKELONG(nItems-1,0)); ! 493: SendDlgItemMessage(hDlg,nSpinID,UDM_SETPOS,0,(LPARAM)nSelectedItem); ! 494: Dialog_EnableItem(hDlg,nSpinID,TRUE); ! 495: } ! 496: ! 497: return(nSelectedItem); ! 498: } ! 499: */ ! 500: ! 501: //----------------------------------------------------------------------- ! 502: /* ! 503: Get Spin control item ! 504: */ ! 505: /* ! 506: int Dialog_GetSpinList(HWND hDlg, int nSpinID) ! 507: { ! 508: return( LOWORD(SendDlgItemMessage(hDlg,nSpinID,UDM_GETPOS,0,(LPARAM)0)) ); ! 509: } ! 510: */ ! 511: ! 512: //----------------------------------------------------------------------- ! 513: /* ! 514: Update Spin control with new selection, called from WM_VSCROLL ! 515: */ ! 516: /* ! 517: int Dialog_UpdateSpinList(HWND hDlg, int nEditBoxID, char *pSpinStrings[], int nNumSpinItems, int nNewSelectedItem) ! 518: { ! 519: // Is item within range? ! 520: if (nNewSelectedItem<0) ! 521: nNewSelectedItem = 0; ! 522: if (nNewSelectedItem>=nNumSpinItems) ! 523: nNewSelectedItem = nNumSpinItems-1; ! 524: ! 525: // Fill text with new selected item ! 526: Dialog_SetText(hDlg,nEditBoxID,pSpinStrings[nNewSelectedItem]); ! 527: ! 528: // Return new value ! 529: return(nNewSelectedItem); ! 530: } ! 531: */ ! 532: ! 533: //----------------------------------------------------------------------- ! 534: /* ! 535: Set number of dialog radio buttons ! 536: */ ! 537: /* ! 538: void Dialog_SetRadioButtons(HWND hDlg,int StartButtonID,int EndButtonID,int nSelectedItem) ! 539: { ! 540: CheckRadioButton(hDlg,StartButtonID,EndButtonID,StartButtonID+nSelectedItem); // Run ST speed or max? ! 541: } ! 542: */ ! 543: ! 544: //----------------------------------------------------------------------- ! 545: /* ! 546: Read status of dialog radio buttons, return index of chosen option from '0' ! 547: */ ! 548: /* ! 549: int Dialog_ReadRadioButtons(HWND hDlg,int StartButtonID,int EndButtonID) ! 550: { ! 551: int i; ! 552: ! 553: for(i=StartButtonID; i<=EndButtonID; i++) { ! 554: if (IsDlgButtonChecked(hDlg,i)==BST_CHECKED) ! 555: return(i-StartButtonID); ! 556: } ! 557: ! 558: return(0); ! 559: } ! 560: */ ! 561: ! 562: //----------------------------------------------------------------------- ! 563: /* ! 564: Add 'Column' to List View ! 565: */ ! 566: /* ! 567: void Dialog_AddListViewColumn(HWND hDlg, int ListViewID, int Order, char *pString, int Width) ! 568: { ! 569: LVCOLUMN LvColumn; ! 570: ! 571: // Build structure ! 572: LvColumn.mask = LVCF_FMT|LVCF_TEXT|LVCF_WIDTH; ! 573: LvColumn.fmt = LVCFMT_LEFT; ! 574: LvColumn.cx = Width; ! 575: LvColumn.pszText = pString; ! 576: LvColumn.cchTextMax = 0; ! 577: LvColumn.iSubItem = 0; ! 578: LvColumn.iImage = 0; ! 579: LvColumn.iOrder = 0; ! 580: ! 581: // Add Column ! 582: SendDlgItemMessage(hDlg,ListViewID,LVM_INSERTCOLUMN,Order,(LONG)&LvColumn); ! 583: } ! 584: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.