vvolka
Новенький
Offline
|
|
« : 11-01-2014 17:29 » |
|
Задача. В первой странице блокнота содержатся списки паспортных данных пациентов клиники. Во второй странице блокнота хранятся данные из их медицинских карт. При раскрытии любой страницы в его списках должны быть выбраны данные, соответствующие выбранным данным другой страницы. Помогите, пожалуйста, решить проблему с выделением строк в списках: Заголовочный файл: (click to show) #include <Windows.h> LPWORD lpwAlign(LPWORD); int nCopyAnsiToWideChar(LPWORD,LPCSTR); void DlgTemplate(PWORD& p,DWORD lStyle,int items, int x,int y,int cx,int cy,LPSTR txt); void DlgItemTemplate(PWORD& p,DWORD lStyle,int x,int y,int cx,int cy,WORD id,LPSTR classname,LPSTR txt); LPWORD lpwAlign(LPWORD lpln) { ULONG ul = (ULONG)lpln; ul += 3; ul >>= 2; ul <<= 2; return (LPWORD)ul; } int nCopyAnsiToWideChar(LPWORD lpWCStr,LPCSTR lpAnsiln) { int cchAnsi=lstrlen(lpAnsiln); return MultiByteToWideChar(GetACP(),MB_PRECOMPOSED,lpAnsiln,cchAnsi,(LPWSTR)lpWCStr,cchAnsi)+1; } void DlgTemplate(PWORD& p, DWORD IStyle, int items, int x, int y, int cx, int cy, LPSTR txt) { *p++ = LOWORD(IStyle); //В первые два слова *p++ = HIWORD(IStyle); //записываем стиль панели *p++ = 0; //В следующие две строки можно *p++ = 0; //записать расширенный стиль окна *p++ = items; //Число элементов управления панели *p++ = x; //Координата левого края панели *p++ = y; //Координата верхнего края панели *p++ = cx; //Ширина панели *p++ = cy; //Высота панели *p++ = 0; //Меню не подключается *p++ = 0; //Используем стандартный класс //Преобразуем Ansi-строку заголовка в строку Unicode int nchar=nCopyAnsiToWideChar(p,TEXT(txt)); p += nchar; //Смещаем указатель на количество символов //Выравниваем шаблон по границе WORD p=lpwAlign((LPWORD)p); } void DlgItemTemplate(PWORD& p, DWORD IStyle, int x, int у, int cx, int cy, WORD id, LPSTR classname, LPSTR txt) { *p++ = LOWORD(IStyle); // В первые два слова *p++ = HIWORD(IStyle); //записываем стиль элемента управления *p++ = 0; //В следующие две строки можно *p++ = 0; //записать расширенный стиль окна *p++ = x; //Координата левого края элемента управления *p++ = у; //Координата верхнего фая элемента управления *p++ = cx; //Ширина элемента управления *p++ = cy; //Высота элемента управления *p++ = id; //Идентификатор элемента управления int nchar= nCopyAnsiToWideChar( p, TEXT(classname)); p += nchar; //Смещаем указатель на количество символов //Преобразуем Ansi-строку заголовка в строку Unicode if (lstrlen(txt) > 0) nchar = nCopyAnsiToWideChar( p, TEXT(txt)); else nchar = nCopyAnsiToWideChar(p,TEXT("")); p += nchar; //Смещаем указатель на число символов *p++ = 0; //Дополнительные данные не используем //Выравниваем шаблон по границе p=lpwAlign((LPWORD)p); } Текст приложения: (click to show) #include <fstream> #include <windows.h> #include <prsht.h> #include "CreateDlg.h" #include <Commdlg.h> #pragma comment (lib,"comctl32.lib") #define ID_STATIC0 1000 #define ID_BUTTON1 1001 #define ID_BUTTON2 1002 #define ID_BUTTON3 1003 #define ID_HELP 1004 #define ID_STATIC1 2003 #define ID_LISTBOX1 2004 #define ID_LISTBOX2 2005 #define ID_CREATEDLG 100 #define N1 21 #define N2 81 #define TOTAL_SIZE (3*N1 + N2) BOOL RegClass(WNDPROC, LPCTSTR, UINT); LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); LRESULT CALLBACK WndForDlg(HWND,UINT,WPARAM,LPARAM); LRESULT CALLBACK DlgProc0(HWND,UINT,WPARAM,LPARAM); LRESULT CALLBACK DIgProc1 (HWND,UINT,WPARAM,LPARAM); WORD* CreateDlg0(HWND); WORD* CreateDlg1(HWND); HINSTANCE hInstance; char szClass[ ]="WindowAppClass"; char szForDlg[ ]="PopupWindow"; int wScreen, hScreen; static HWND hForDlg; static HWND hListBox1; static HWND hListBox2; int iCurItem; // текущий выбранный элемент списка using namespace std; fstream fdat; struct SubStr { char name[N1]; char phone[N1]; char birthday[N1]; char address[N2]; }; union Data { SubStr ss; char line[TOTAL_SIZE]; }; class ListItem { char buf[TOTAL_SIZE]; public: ListItem() { Clear(); } // Очистка данных (заполнение строки line пробелами) void Clear() { memset(dat.line, ' ', TOTAL_SIZE); } // Замена в строке line всех нулевых байтов, кроме последнего, // символом 'пробел' Data dat; }; ListItem item; BOOL fileopen (const char *filename, HWND hwnd) { fdat.open(filename, ios::in); if (!fdat) { fdat.clear(); return TRUE; } else while (1) { fdat.getline(item.dat.line, sizeof(Data)); if (fdat.eof()) { fdat.clear(); break; } SendMessage(hwnd, LB_ADDSTRING, 0, (LPARAM)item.dat.line); SendMessage(hwnd,WM_SETREDRAW,TRUE,0L); } fdat.close(); return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow) { MSG msg; HWND hwnd; ::hInstance=hInstance; if (!RegClass(WndProc,szClass,COLOR_DESKTOP)) return FALSE; if (!RegClass(WndForDlg,szForDlg,0)) return FALSE; wScreen=GetSystemMetrics(SM_CXSCREEN); hScreen=GetSystemMetrics(SM_CYSCREEN); hwnd = CreateWindow(szClass, "Паспортные данные пациентов клиники", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0,0, wScreen, hScreen, 0,0, hInstance, NULL); if (!hwnd) return FALSE; hForDlg=CreateWindow(szForDlg, NULL, WS_POPUP, 0, 0,10,10, hwnd, 0, hInstance, NULL); while(GetMessage(&msg, 0,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } BOOL RegClass(WNDPROC Proc, LPCTSTR szName, UINT brBackground) { WNDCLASS wc; wc.style=wc.cbClsExtra=wc.cbWndExtra=0; wc.lpfnWndProc=Proc; wc.hInstance = hInstance; wc.hIcon=LoadIcon(NULL,IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(brBackground +1); wc.lpszMenuName = (LPCTSTR)NULL; wc.lpszClassName=szName; return (RegisterClass(&wc) != 0); } LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_LBUTTONDOWN: { hInstance = GetModuleHandle(NULL); SendMessage(hForDlg, WM_COMMAND, ID_CREATEDLG, 0L); return 0; } case WM_DESTROY: { PostQuitMessage(0); return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam); } int CALLBACK PSCallback( HWND hdlg, UINT uMsg, LPARAM lParam) { if (uMsg==PSCB_INITIALIZED) { RECT rc; GetWindowRect(hdlg, &rc); int l=rc.left, t=rc.top, w=rc.right-l, h=rc.bottom-t; MoveWindow(hForDlg, (wScreen-w)/2, (hScreen-h)/2, w, h, TRUE); } return 0; } LRESULT CALLBACK WndForDlg( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_COMMAND: switch (LOWORD(wParam)) { case ID_CREATEDLG: { static PROPSHEETPAGE pPage[2]; static PROPSHEETHEADER pHeader; pPage[0].dwSize = sizeof(PROPSHEETPAGE); pPage[0].dwFlags = PSP_USETITLE | PSP_DLGINDIRECT; pPage[0].pResource =(DLGTEMPLATE*)CreateDlg0(hwnd); pPage[0].pfnDlgProc = (DLGPROC)DlgProc0; pPage[0].pszTitle = "Списки"; pPage[1].dwSize = sizeof(PROPSHEETPAGE); pPage[1].dwFlags = PSP_USETITLE | PSP_DLGINDIRECT; pPage[1].pResource = (DLGTEMPLATE*)CreateDlg1(hwnd); pPage[1].pfnDlgProc = (DLGPROC)DlgProc0; pPage[1].pszTitle = "Данные"; pHeader.dwSize = sizeof(PROPSHEETHEADER); pHeader.dwFlags =PSH_PROPSHEETPAGE | PSH_USECALLBACK; pHeader.hwndParent = hwnd; pHeader.pszCaption = "Изменение свойств приложения"; pHeader.nPages = sizeof(pPage)/sizeof(PROPSHEETPAGE); pHeader.ppsp = (LPCPROPSHEETPAGE)pPage; pHeader.pfnCallback=(PFNPROPSHEETCALLBACK)PSCallback; PropertySheet(&pHeader); LocalFree(LocalHandle(pPage[0].pResource)); LocalFree(LocalHandle(pPage[1].pResource)); return 0; } return 0; } } return DefWindowProc(hwnd, msg, wParam, lParam); } WORD* CreateDlg0( HWND hwnd) { char const caption[ ]="Изменение режима работы приложения"; char const stattxt[ ]="Паспорта пациентов:"; char const names[ ]="Пациенты:"; char const passports[ ]="Паспортные данные:"; WORD *p, *pdlgtemplate; pdlgtemplate=p=(PWORD)LocalAlloc(LPTR,4000); int cxChar, cyChar; { TEXTMETRIC tm; HDC hdc=GetDC(hwnd); GetTextMetrics(hdc,&tm); ReleaseDC(hwnd,hdc); cxChar=tm.tmAveCharWidth+1 ; cyChar=tm.tmHeight+tm.tmExternalLeading; } DWORD dlgunit =GetDialogBaseUnits(); int dlgwunit=LOWORD(dlgunit), dlghunit=HIWORD(dlgunit); cxChar=cxChar*4/dlgwunit; cyChar=cyChar*8/dlghunit; int wDlg, hDlg, wItem, hItem, left, top; DWORD IStyle; //Записываем в шаблон данные панели IStyle = DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION; wDlg=lstrlen(caption)*cxChar; hDlg=cyChar*8; DlgTemplate(p, IStyle, 4,0,0, wDlg, hDlg, (LPSTR)caption); //Далее добавляем записи для элементов управления //1 hItem=cyChar; top=left=hItem/2; hItem+=left; wItem=(wDlg+left-left); IStyle = WS_CHILD | WS_VISIBLE | BS_GROUPBOX | WS_TABSTOP; DlgItemTemplate(p, IStyle, left, top, wItem, 6*hItem+left, ID_STATIC0,(LPSTR)"button",(LPSTR)stattxt); //2 top+=hItem; left += left; IStyle = SS_LEFT | WS_CHILD | WS_VISIBLE; //IStyle = LBS_NOTIFY | LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP; DlgItemTemplate(p, IStyle, left, top, wItem/2, hItem, -1, (LPSTR)"static",(LPSTR)names); //3 IStyle = SS_LEFT | WS_CHILD | WS_VISIBLE; //IStyle = LBS_NOTIFY | LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP; DlgItemTemplate(p, IStyle, left*6, top, lstrlen(passports)*cxChar, hItem, -1, (LPSTR)"static",(LPSTR)passports); //4 top+=hItem; wItem -= left; IStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | LBS_STANDARD ;//| LBS_DISABLENOSCROLL; DlgItemTemplate(p, IStyle, left, top, wItem, hItem*4, ID_LISTBOX1,(LPSTR)"listbox",(LPSTR)"\0"); return pdlgtemplate; } WORD* CreateDlg1( HWND hwnd) { char const caption[ ]="Изменение режима работы приложения"; char const stattxt[ ]="Жалобы пациентов:"; char const names[ ]="Пациенты:"; char const complaints[ ]="Жалобы:"; //Выделяем блок памяти для записи шаблона WORD *p, *pdlgtemplate; pdlgtemplate=p=(PWORD)LocalAlloc(LPTR,4000); int cxChar, cyChar; { TEXTMETRIC tm; HDC hdc=GetDC(hwnd); GetTextMetrics(hdc,&tm); ReleaseDC(hwnd,hdc); cxChar=tm.tmAveCharWidth+1 ; cyChar=tm.tmHeight+tm.tmExternalLeading; } DWORD dlgunit = GetDialogBaseUnits(); int dlgwunit=LOWORD(dlgunit), dlghunit=HIWORD(dlgunit); cxChar=cxChar*4/dlgwunit; cyChar=cyChar*8/dlghunit; int wDlg, hDlg, wItem, hItem, left, top; DWORD IStyle; //Записываем в шаблон данные панели IStyle = DS_MODALFRAME | WS_POPUPWINDOW | WS_CAPTION; wDlg=lstrlen(caption)*cxChar; hDlg=cyChar*8; DlgTemplate(p, IStyle, 4,0,0, wDlg, hDlg, (LPSTR)caption); //Далее добавляем записи для элементов управления //1 hItem=cyChar; top=left=hItem/2; hItem+=left; wItem=(wDlg+left-left); IStyle = WS_CHILD | WS_VISIBLE | BS_GROUPBOX | WS_TABSTOP; DlgItemTemplate(p, IStyle, left, top, wItem, 6*hItem+left, ID_STATIC0,(LPSTR)"button",(LPSTR)stattxt); //2 top+=hItem; left += left; IStyle = SS_LEFT | WS_CHILD | WS_VISIBLE; //IStyle = LBS_NOTIFY | LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP; DlgItemTemplate(p, IStyle, left, top, wItem/2, hItem, -1, (LPSTR)"static",(LPSTR)names); //3 IStyle = SS_LEFT | WS_CHILD | WS_VISIBLE; //IStyle = LBS_NOTIFY | LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP; DlgItemTemplate(p, IStyle, left*6, top, wItem/2, hItem, -1, (LPSTR)"static",(LPSTR)complaints); //4 top+=hItem; wItem -= left; IStyle = WS_CHILD | WS_VISIBLE | WS_TABSTOP | LBS_STANDARD ;//| LBS_DISABLENOSCROLL; DlgItemTemplate(p, IStyle, left, top, wItem, hItem*4, ID_LISTBOX2,(LPSTR)"listbox",(LPSTR)"\0"); return pdlgtemplate; } LRESULT CALLBACK DlgProc0(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { hListBox1=GetDlgItem(hdlg,ID_LISTBOX1); hListBox2=GetDlgItem(hdlg,ID_LISTBOX2); fileopen("names.dat",hListBox1); fileopen("complaints.dat",hListBox2); } case WM_COMMAND: { switch (LOWORD(wParam)) { case ID_LISTBOX1: switch (HIWORD(wParam)) { case LBN_SELCHANGE: iCurItem = SendMessage(hListBox1, LB_GETCURSEL, 0, 0); SendMessage(hListBox2, LB_SETCURSEL, iCurItem, NULL); } } } } return FALSE; } LRESULT CALLBACK DlgProc1(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_INITDIALOG: { //HWND hListBox1=GetDlgItem(hdlg,ID_LISTBOX1); hListBox2=GetDlgItem(hdlg,ID_LISTBOX2); //fileopen("names.dat",hListBox1); fileopen("complaints.dat",hListBox2); } case WM_COMMAND: { switch (LOWORD(wParam)) { case ID_LISTBOX2: switch (HIWORD(wParam)) { case LBN_SELCHANGE: iCurItem = SendMessage(hListBox2, LB_GETCURSEL, 0, 0); SendMessage(hListBox1, LB_SETCURSEL, iCurItem, 0); } } } } return FALSE; }
|
|
|
Записан
|
|
|
|