Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: Venk
Дата сообщения: 03.05.2006 21:10
Здравствуйте!
Есть проблема - нужно программировать на API графический интерфейс, но что-то не получается. Поэтому помогите чем можно - ссылки на литературу или пример программы - желательно чтобы там был пример работы со списком - вставка чекбоксов, раскраска колонок и строк и т. д.
Заранее спасибо.
Автор: tomegadeth
Дата сообщения: 03.05.2006 22:07
vshersh почти так пробовал - но однако, наступал на
Цитата:
[C++ Error] : E2109 Not an allowed type

distance спасибо, вроде что надо, реально помогло.

Автор: TeXpert
Дата сообщения: 04.05.2006 04:57
Venk

Цитата:
...нужно программировать на API

Есть соответствующая тема.

А вообще -- смотри книгу Петзолда. И изучай коды реальных утилит, таковых с открытым кодом много.
Автор: Mickey_from_nsk
Дата сообщения: 04.05.2006 06:41
Venk

Цитата:
но что-то не получается

А что именно не получается?
Автор: Venk
Дата сообщения: 10.05.2006 21:18
Здравствуйте!
Я тут открыл тему ну ее видно перенесли сюда в этот пост неполностью. Суть в том, что не получается раскрасить листвью. Перехватываю сообщение wm_customdraw. Пишу вот такой обработчик:
case WM_NOTIFY:
{

if (wParam != IDC_LIST1)
             break;
    LPNMLISTVIEW pnm = (LPNMLISTVIEW)lParam;
switch (pnm->hdr.code)
{        
case NM_CUSTOMDRAW:
{
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;

if (lplvcd->nmcd.dwDrawStage == CDDS_PREPAINT){
MessageBox(g_hWnd, "Сюда сообщение приходит", "Message",MB_OK);
return CDRF_NOTIFYITEMDRAW;}

if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
{
     MessageBox(g_hWnd, "А вот сюда уже нет! Почему???", "Ошибка",MB_OK);
         if (!(lplvcd->nmcd.dwItemSpec % 3)){
HFONT g_hNewFont = MyCreateFont();
SelectObject (lplvcd->nmcd.hdc, g_hNewFont);
        
else
return CDRF_DODEFAULT;

lplvcd->clrText = RGB(150, 75, 150);
lplvcd->clrTextBk = RGB(255,255,255);

return CDRF_NEWFONT;}
}
}
}
}

Автор: Bol970
Дата сообщения: 12.05.2006 09:10
Hello All

у меня трабла, я пишу на delphi, а мне нужно перевести с с++
я не знаю как сие читается


Код:
strcmd[3] = *(VCode+VNum*4);
Автор: DeviL
Дата сообщения: 12.05.2006 09:44
Bol970
В третий элемент массива strcmd помещается VNum*4 элемент массива VCode.
Читается примерно так:
Читается как третьему элементу массива strcmd присваивается разыменованый указатель на начало массива VCode со смещением VNum*4.
Автор: Bol970
Дата сообщения: 12.05.2006 09:53
DeviL
спасибо, буду разбираться дальше.

я так понял * после = это операция разыменования?
Автор: DeviL
Дата сообщения: 14.05.2006 13:11
Bol970

Цитата:
я так понял * после = это операция разыменования?

да
Автор: Mickey_from_nsk
Дата сообщения: 15.05.2006 06:48
Venk

Цитата:
if (lplvcd->nmcd.dwDrawStage == CDDS_PREPAINT){
MessageBox(g_hWnd, "Сюда сообщение приходит", "Message",MB_OK);
return CDRF_NOTIFYITEMDRAW;}

Попробуй return убрать.
Автор: AnGo
Дата сообщения: 15.05.2006 13:18
Hi, All!

Есть ли здесь знатоки VC++ и BCB 6 в одном флаконе?
Есть хорошая бибилиотека темплэйтов для работы с деревьями, но беда в том, что она написана для VC++ и под Билдером выдает ошибки такого типа:

[C++ Error] basic_tree.h(88): E2507 'basic_tree<stored_type,tree_type,container_type>::const_iterator::it' is not a direct base class of 'basic_tree<stored_type,tree_type,container_type>::iterator'

[C++ Error] unique_tree.inl(110): E2316 'unique_tree<stored_type,node_compare_type,node_order_compare_type>::insert(const stored_type &)' is not a member of 'unique_tree<stored_type,node_compare_type,node_order_compare_type>'

У самого, что-то лыжи совсем не едут, на мой взгляд в сорцах никакого криминала нет, или я просто не вижу его.

Сама библиотека и примеры к ней живут здесь

http://www.datasoftsolutions.net/

Вообщем, хелп, люди добрые!
Автор: SaDFromSpb
Дата сообщения: 15.05.2006 18:46
Почему вот этот код отрабатывает нормально?

Код:
#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char* argv[]) {
vector<int> vec(3);
for (int i=0; i<100; i++)
{
vec[i] = 4*i;
cout << vec[i] << endl;
}
cout << vec.size() << endl;
return 0;
}
Автор: xitsa
Дата сообщения: 15.05.2006 21:03
to SaDFromSpb
На самом деле, так как оператор [] не обременен проверкой, идет порча памяти в куче, что чревато глюками при следующем выделении:
vector<> выделяет блок определенного размера по умолчанию и далее как с обычным массивом, очень легко выйти за пределы и порушить кучу. Чревато трудно отлавливаемыми багами (у себя сумел отловить только при переводе на STLport части кода и включения отладочного режима).
Плюс в некоторых реализациях STL память по умолчанию выделяется блоками, размерами в страницу (4096 байт), почему и встроенная защита может не сработать.
В общем, я использую push_back'и и insert'ы вместо выделения сразу необходимого количества элементов по умолчанию — глюков меньше
Автор: SaDFromSpb
Дата сообщения: 16.05.2006 15:31
То есть оператор [] и не должен нифига проверять?
Это очень печально. Он как-то изящнее выглядит по сравнению с at(), но с другой стороны и проверка должна быть.
Автор: Mickey_from_nsk
Дата сообщения: 17.05.2006 11:01
SaDFromSpb
Увы, согласно стандарта - не должен.
Кстати, а почему увы?
Если приходится это проверять, наверно есть сомнения в корректности кода? А если есть сомнения, может алгоритм пересмотреть?
Автор: SaDFromSpb
Дата сообщения: 18.05.2006 09:09
Mickey_from_nsk

Цитата:
Если приходится это проверять, наверно есть сомнения в корректности кода? А если есть сомнения, может алгоритм пересмотреть?
Дело в том, что пишется библиотека, которой будет пользоваться неизвестно кто и неизвестно когда.

Цитата:
Увы, согласно стандарта - не должен.
Да... хотя немного странно, ведь для контейнера map квадратные скобки создают новый элемент, если операнд не входит в существующие ключи.
Автор: Mickey_from_nsk
Дата сообщения: 18.05.2006 11:06
SaDFromSpb

Цитата:
Да... хотя немного странно, ведь для контейнера map квадратные скобки создают новый элемент, если операнд не входит в существующие ключи.

Но заметь, что и там исключение не бросается. Может дело в единообразии по исключениям?
Автор: Slay1
Дата сообщения: 18.05.2006 21:38
Как обращаться к елементам двухмерного массива с помощью указателей?
Например для одномерного:
a[i] == *(a+1)
А для двух a[i][j] == ??
Автор: EVD
Дата сообщения: 18.05.2006 21:52
Slay1
Двухмерный массив это массив, каждый элемент которого одномерный массив.
Следовательно:

Код:
a[0][0] = *(*(a+1)+1);
//a[0][0] = a[1][1];
Автор: Slay1
Дата сообщения: 18.05.2006 22:12
EVD
Спасибо!!
Автор: Mickey_from_nsk
Дата сообщения: 19.05.2006 05:27
EVD
Поправка. Если я не ошибаюсь, то если массив объявлен как
int a[10][20]
То в памяти создается плоский (одномерный) массив, а доступ к элементам по указателю будет как *(a+10*i+j).
Сказанное тобой справедливо для массивов, объявленных в виде
int a[][], а затем выделенных с помощью динамических операторов.
Автор: EVD
Дата сообщения: 19.05.2006 07:05
Mickey_from_nsk
Мне кажется, что ты ошибаешся
Если бы так и было, то код, приведенный мной, не сработал бы, т.к. у меня там двойное разименование указателя. А код работает. Следовательно конструкция int a[10][20] создает не одномерный массив, а двухмерный (массив из указателей)
Автор: DeviL
Дата сообщения: 19.05.2006 09:50

Цитата:
При выполнении объявления двумерного массива int arr2[4][3] в памяти выделяется участок для хранения значения переменной arr, которая является указателем на массив из четырех указателей. Для этого массива из четырех указателей тоже выделяется память. Каждый из этих четырех указателей содержит адрес массива из трех элементов типа int, и, следовательно, в памяти компьютера выделяется четыре участка для хранения четырех массивов чисел типа int, каждый из которых состоит из трех элементов.


Цитата:
объявление arr2[4][3] порождает в программе три разных объекта: указатель с идентификатором arr, безымянный массив из четырех указателей и безымянный массив из двенадцати чисел типа int. Для доступа к безымянным массивам используются адресные выражения с указателем arr. Доступ к элементам массива указателей осуществляется с указанием одного индексного выражения в форме arr2[2] или *(arr2+2). Для доступа к элементам двумерного массива чисел типа int должны быть использованы два индексных выражения в форме arr2[1][2] или эквивалентных ей *(*(arr2+1)+2) и (*(arr2+1))[2].

Чтобы не осталось неясностей.
Автор: WiseAlex
Дата сообщения: 19.05.2006 12:33
DeviL
как то это странно. например такой код работает:

Код:
#include <assert.h>
int array[2][2]={{1,2},{3,4}};
int main(int argc, _TCHAR* argv[])
{
int * pInt = (int*)array;
assert(*pInt==1);
pInt = (int*)(array[0]);
assert(*pInt==1);
pInt = (int*)(&array[0][0]);
assert(*pInt==1);
return 0;
}
Автор: SaDFromSpb
Дата сообщения: 20.05.2006 19:25
WiseAlex
Да.. согласен.

Код: int * pInt0 = (int*)array;
int * pInt1 = (int*)(array[0]);
int * pInt2 = (int*)(&array[0][0]);
assert(pInt0==pInt1);
assert(pInt1==pInt2);
Автор: Venk
Дата сообщения: 21.05.2006 09:38

Цитата:
return CDRF_NOTIFYITEMDRAW

Дык ить в МСДН написано, что посылая этот идентификатор мы и заставляем колонки прорисовываться по нашему, а если его не послать, то они будут рисоваться по дефолту...
Хотя попробую.
Автор: Mickey_from_nsk
Дата сообщения: 22.05.2006 06:29
EVD
А мне кажется, что я, все таки, прав. Давненько не брал я в руки книжек, но смотри, например, здесь (понимаю - не авторитет, но все таки) http://www.madi.ru/study/kafedra/asu/metod/program_c2/2_3.shtml

Цитата:
В памяти ЭВМ матрицы размещаются как одномерные массивы: после одной строки записывается следующая за ней.


Если надо кода - пожалуйста.

Код:
#include <iostream>
using namespace std;

void main(void)
{
    int a[2][3] = {{1,2,3},{4,5,6}};
    int *ptr = &a[0][0];
    
    cout << "size of array is " << sizeof(a) << endl;
    for (int i=0; i<6; i++)
    {
        cout << *ptr << " ";
        ptr++;
    }
}
Автор: DeviL
Дата сообщения: 22.05.2006 10:46
WiseAlex
Цитата из книги "Программирование на языке Си".

Например в примере Mickey_from_nsk все работает так как стандартом гарантировано последовательное размещение в памяти данных.
Разница лишь в понимании того, что создается - если создается двумерный массив, а перемещение в нем не как по многомерному, а как по одномерному - то это ошибка проектирования - ибо нах тогда было его создавать!!? работаешь как с одномерным - создавай одномерный! ИМХО - мое личное мнение )
а насчет "чисто виртуальных" массивов указателей - лично я понял это как например в массиве:

Код: int array[4][4];
Автор: WiseAlex
Дата сообщения: 22.05.2006 12:31
DeviL

Цитата:
array[0] array[1] array[2] array[3] - и есть те самые виртуальные указатели

только физически они нигде не размещены. Это просто абстракция.

Цитата:
Так, что мне кажется главное правильно проектировать код, а не искать возможность обмануть всех и вся!

это к чему?
Автор: DeviL
Дата сообщения: 22.05.2006 16:13
WiseAlex

Код: array[4];

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.