Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Выделить программно строку списка  (Прочитано 4866 раз)
0 Пользователей и 1 Гость смотрят эту тему.
vvolka
Новенький

ru
Offline Offline

« : 11-01-2014 17:29 » 

Задача.
В первой странице блокнота содержатся списки паспортных данных пациентов клиники. Во второй странице блокнота хранятся данные из их медицинских карт. При раскрытии любой страницы в его списках должны быть выбраны данные, соответствующие выбранным данным другой страницы.
Помогите, пожалуйста, решить проблему с выделением строк в списках:
Заголовочный файл:
(click to show)
Код: (C++)
#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)
Код: (C++)
#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;
}
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 13-01-2014 12:51 » 

vvolka, в чём заключается проблема?
Записан
vvolka
Новенький

ru
Offline Offline

« Ответ #2 : 13-01-2014 15:42 » 

Вад, разобрался уже, спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines