Basically, you can define any functions you need at the top of the file after the includes. Put a prototypes first and then function bodies, so if a function calls another one defined later - compiler will not complain.
#include ...
//
// Prototypes:
//
int foo1 ();
int foo2 ();
int foo3 ();
//
// Functions code
//
int foo1 ()
{
return foo2 ();
}
int foo2 ()
{
return foo3 ();
}
int foo3 ()
{
return 1;
}
Does the following work?
:
:
void FillControls (HWND hwnd, int index)
{
SetDlgItemText(hwnd, IDC_FNAME, member[index].FName);
SetDlgItemText(hwnd, IDC_MI, member[index].MI);
SetDlgItemText(hwnd, IDC_LNAME, member[index].LName);
SetDlgItemText(hwnd, IDC_SUFFIX, member[index].Suffix);
SetDlgItemText(hwnd, IDC_ADDRESS1, member[index].Add1);
}
: BOOL CALLBACK membersDlgProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
: {
: switch(Message){
:
: case WM_INITDIALOG:{
:
: sNum=0;
:
: //SetDlgItemText(hwnd, IDC_FNAME, member[sNum].FName); // I would like to have this
: //SetDlgItemText(hwnd, IDC_MI, member[sNum].MI); // in a function somewhere
: //SetDlgItemText(hwnd, IDC_LNAME, member[sNum].LName); // to be called by each
: //SetDlgItemText(hwnd, IDC_SUFFIX, member[sNum].Suffix); // case where needed
: //SetDlgItemText(hwnd, IDC_ADDRESS1, member[sNum].Add1);
:
: FillControls (hwnd, sNum);
: return TRUE;}
:
: case WM_COMMAND:
:
: switch(LOWORD(wParam)){
:
: case IDC_ARTFM:{
:
: int i = 0;
: while (strcmp(member[i].LName, "") != 0 && i<1000)
: i++;
: if (i<1000)
: sNum=i;
:
: //SetDlgItemText(hwnd, IDC_FNAME, member[sNum].FName);
: //SetDlgItemText(hwnd, IDC_MI, member[sNum].MI);
: //SetDlgItemText(hwnd, IDC_LNAME, member[sNum].LName);
: //SetDlgItemText(hwnd, IDC_SUFFIX, member[sNum].Suffix);
: //SetDlgItemText(hwnd, IDC_ADDRESS1, member[sNum].Add1);
: FillControls (hwnd, sNum);
: }
:
: break;
:
: case IDC_NEXT:{
:
: int i = 0;
: char tempScore[10];
: if (sNum<999)
: sNum++;
:
: //SetDlgItemText(hwnd, IDC_FNAME, member[sNum].FName);
: //SetDlgItemText(hwnd, IDC_MI, member[sNum].MI);
: //SetDlgItemText(hwnd, IDC_LNAME, member[sNum].LName);
: //SetDlgItemText(hwnd, IDC_SUFFIX, member[sNum].Suffix);
: //SetDlgItemText(hwnd, IDC_ADDRESS1, member[sNum].Add1);
: FillControls (hwnd, sNum);
: }
:
: break;
:
: case IDC_PREV:{
:
: int i = 0;
: char tempScore[10];
: if (sNum>0)
: sNum--;
:
: //SetDlgItemText(hwnd, IDC_FNAME, member[sNum].FName);
: //SetDlgItemText(hwnd, IDC_MI, member[sNum].MI);
: //SetDlgItemText(hwnd, IDC_LNAME, member[sNum].LName);
: //SetDlgItemText(hwnd, IDC_SUFFIX, member[sNum].Suffix);
: //SetDlgItemText(hwnd, IDC_ADDRESS1, member[sNum].Add1);
: FillControls (hwnd, sNum);
: }
:
: break;
:
: case IDC_UPDATE:{
:
: GetDlgItemText(hwnd, IDC_FNAME, member[sNum].FName, 20);
: GetDlgItemText(hwnd, IDC_MI, member[sNum].MI, 3);
: GetDlgItemText(hwnd, IDC_LNAME, member[sNum].LName, 20);
: GetDlgItemText(hwnd, IDC_SUFFIX, member[sNum].Suffix, 5);
: GetDlgItemText(hwnd, IDC_ADDRESS1, member[sNum].Add1, 30);
: }
:
: // I would like to call ID_FILE_SAVE here
:
: // So, you have two window procedures for now: main window
: // and this dialog? I see two choices:
: //
: // 1. Create a function similar as I did with 'Fill Controls'
: // for whole ID_FILE_SAVE case and call it here.
: //
: // 2. If the parent of this dialog is the main window
: // handle and not NULL, then simply send WM_COMMAND message
: // to it, like that:
: //
: // SendMessage (GetParent (hwnd), WM_COMMAND, ID_FILE_SAVE, 0);
: //
: break;
:
: return TRUE;
: }
:
: LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
: {
: switch(Message){
:
: case WM_COMMAND:
:
: switch(LOWORD(wParam)){
:
: case ID_FILE_EXIT:
:
: PostMessage(hwnd, WM_CLOSE, 0, 0);
: break;
:
: case ID_FILE_LOAD:{
:
: ifstream file;
: file.open("Tracker.sht", ios::binary);
: if (file)
: while (!file.eof()){
: file.read((char *)(&member[sNumRead]), sizeof(member[sNumRead]));
: sNumRead++;
: if (sNumRead>999)
: break;
: }
: file.close();
: }
: break;
:
: case ID_FILE_SAVE:{
:
: ofstream file;
: file.open("Tracker.sht", ios::binary);
: i=0;
: if (file)
: while (i<10){
: if (strcmp(member[i].LName, "") != 0)
: file.write((char *)(&member[i]), sizeof(member[sNum]));
: i++;
: }
: file.close();
: }
: break;
: }
: break;
:
: case WM_CLOSE:
: DestroyWindow(hwnd);
: break;
:
: case WM_DESTROY:
: PostQuitMessage(0);
: break;
:
: default:
: return DefWindowProc(hwnd, Message, wParam, lParam);
: }
: return 0;
: }
: :
: I've tried creating a function to house the duplicate code, but I
: haven't found anywhere I can place it where it will compile and I
: can call it, including putting it under its own case, since I can't
: seem to call by case label either. I've tried PostMessage(),
: SendMessage() and PostThreadMessage(). They compile fine, but are
: (seemingly) ignored. I looked at SendDlgItemMessage(), but it
: seemed more for filling an edit control so I didn't try it. I would
: merely like to invoke a case from within another.
:
: Thanks again for all your help.
:
: Take Care,
: Ed
: