ger_kar писал(а):Может GetClassName?Qwertiy писал(а):GetWindowClass
Ну да, перепутал.
ger_kar писал(а):Может GetClassName?Qwertiy писал(а):GetWindowClass
Все равно спасибо. Ибо начал искать GetWindowClass, и нашел GetClassNameQwertiy писал(а):Ну да, перепутал.
Нет никаких секретов Стандартный мне не нравиться многим, включая и внешний вид. У того контрола, который я хочу допилить до нормального, тоже куча недостатков, но их проще устранить, чем переделать стандартный контрол. Привязать к текстовому полю не проблема. Сделать так что-бы он захлопывался при двойном клике на дате тоже. Есть еще досадные недоразумения, но думаю и их можно будет исправить.А вообще - какой функциональности не хватает, если не секрет. Может, по другому решить можно? И чем стандартный DTP не устраивает?
ger_kar писал(а):Все равно спасибо. Ибо начал искать GetWindowClass, и нашел GetClassNameQwertiy писал(а):Ну да, перепутал.
ger_kar писал(а):Конечно в этом случае можно не париться со структурой, и сделать:
Declare Function ChildWindowFromPoint Lib "user32.dll" (ByVal hWndParent As Long, ByVal x As Long, ByVal y As Long) As Long
Но возникает вопрос, может все таки можно исхитриться и передать как то структуру ByVal? Хорошо, в этом случае всего два поля и передать их по отдельности не проблема, а вот если структура не такая простая? Или таких случаев в принципе не бывает? Я тоже удивился, до этого не разу не встречал передачу структуры ByVal.
Зависит от размера поля, разрядности системы и внутренней реализации функции. Так, в (Child)WindowFromPoint в 32-бит -> x,y, а в 16-бит ->y,xger_kar писал(а):И еще, если таким образом структуру пихать с стек, то какое поле должно идти первым?
ark писал(а):Большие структуры никто в стэк запихивать не будет.
Это в смысле "Никогда не говори никогда"? Значит, с "никто" погорячился. Хотя с трудом даже теоретически могу представить себе такую ситуацию. Ну, разве что между процессами. Да и то вряд ли.Хакер писал(а):Не правда
С какого перепугу? Данные со стека всё равно надо вытаскивать в ячейки памяти (если работать "интенсивно"), чем это эффективнее чем обращаться к полям структуры по смещению? Оба этих варианта эффективнее (возможно) если функция использует поля один раз в предопределённой последовательности - тогда можно сразу в регистры вытаскивать.Хакер писал(а):Но оба этих варианта эффективнее, чем твой третий вариант «1 параметр — ссылка на структуру с N полей типа DWORD», если функция интенсивно использует поля переданной структуры.
А ютиться в урезанном стэке, ожидая stack overflow - лучше?Хакер писал(а):придётся ютиться на меньшем количестве РОН под свою задачу
ark писал(а):А ютиться в урезанном стэке, ожидая stack overflow - лучше?
Да можно, только с теми же самыми извращениями. Хакер уже писал (и здесь я полностью согласен)ger_kar писал(а):VB6 вообще нельзя передать сруктуру по значению
А как передавать: как кучу аргументов или врукопашную запихивать поля в стэк - роли не играет, только в первом случае это делает сам компилер.Хакер писал(а):Он компилируется в абсолютно идентичный код, как если бы передавалась не структура по значению, а отдельные поля подряд
A2W и W2A тоже?Хакер писал(а):не берём в расчёт alloca
ark писал(а):А ютиться в урезанном стэке, ожидая stack overflow - лучше?
ger_kar писал(а):Вопрос в другом, в VB6 вообще нельзя передать сруктуру по значению.
ark писал(а):А как быть с выравниванием? А если в структуре не DWORDы?
Qwertiy писал(а):Размер стека можно задать при компиляции... По крайней мере, для Си++.
Qwertiy писал(а):А если объявлять в TLB?
Можно также задать своему процессу приоритет реального времени, повесить своё окно поверх всех остальных, поставить в автозагрузку, обязательно запихать в трей и т.п.Qwertiy писал(а):Размер стека можно задать при компиляции...
struct S {int a, b, c, d, e, f, g, h;}; //8 DWORD
//По значению
void foo(S s) {
int ret=0,n=1000*1000;
for (int i=0;i<n;i++){
ret += s.a + s.b + s.c + s.d + s.e + s.f + s.g + s.h +
s.a + s.b + s.c + s.d + s.e + s.f + s.g + s.h +
s.a + s.b + s.c + s.d + s.e + s.f + s.g + s.h;
}
}
//худший вариант - достаём структуру каждый раз
void bar(S* s) {
int ret=0,n=1000*1000;
for (int i=0;i<n;i++){
ret += s->a + s->b + s->c + s->d + s->e + s->f + s->g + s->h +
s->a + s->b + s->c + s->d + s->e + s->f + s->g + s->h +
s->a + s->b + s->c + s->d + s->e + s->f + s->g + s->h;
}
}
//Храним структуру
void bar2(S* s) {
int ret=0,n=1000*1000;
S x=*s;
for (int i=0;i<n;i++){
ret += x.a + x.b + x.c + x.d + x.e + x.f + x.g + x.h +
x.a + x.b + x.c + x.d + x.e + x.f + x.g + x.h +
x.a + x.b + x.c + x.d + x.e + x.f + x.g + x.h;
}
}
int _tmain(int argc, _TCHAR* argv[]){
S testStruct={1,2,3,4,5,6,7,8};
clock_t start=clock(); foo(testStruct);
std::cout << "Foo(ByVal S) takes " << clock()-start <<std::endl;
start=clock(); bar(&testStruct);
std::cout << "Bar(ByRef S) takes " << clock()-start <<std::endl;
start=clock(); bar2(&testStruct);
std::cout << "Bar2(ByRef S) takes " << clock()-start <<std::endl;
std::cin.get();
return 0;
}
ark писал(а):возможно, существуют ситуации, когда это оправдано - но это, скорее, исключение
Type ARGB
a As Byte
r As Byte
g As Byte
b As Byte
End Type
ark писал(а):Итого: 16, 30, 16.
копирует всю структуру в стек? Т. е. ты передал указатель, а потом разместил там ещё и саму структуру.ark писал(а):S x=*s;
ark писал(а):И, возможно, существуют ситуации, когда это оправдано - но это, скорее, исключение.
CLR - это что управляемый код или что-то другое? И почему например n=1000*1000а не просто n=1000000 в чем сокровенный смысл такой записи?ark писал(а): Кстати, ради спортивного интереса скомпилил с CLR
ger_kar писал(а):CLR - это что управляемый код или что-то другое?
ger_kar писал(а):И почему например n=1000*1000а не просто n=1000000 в чем сокровенный смысл такой записи?
И что прямо в одном проекте и такой и сякой код можно заюзать?Qwertiy писал(а):Си++ единственный язык, позволяющий смешивать managed и unmanaged код
Structure TestStructure
' Sorry for this code
' Yes, they all are integers in VB.NET
Public A, B, C, D, E, F, G, H As Integer
End Structure
Module Program
Private Const N As Integer = 1000000000
Private Function DoItByVal(ByVal X As TestStructure) As Integer
Dim Res As Integer = 0
For Q As Integer = 1 To N
Res = Res Xor X.A Xor X.B Xor X.C Xor X.D Xor X.E Xor X.F Xor X.G Xor X.H
Next Q
Return Res
End Function
Private Function DoItByRef(ByRef X As TestStructure) As Integer
Dim Res As Integer = 0
For Q As Integer = 1 To N
Res = Res Xor X.A Xor X.B Xor X.C Xor X.D Xor X.E Xor X.F Xor X.G Xor X.H
Next Q
Return Res
End Function
Private Function DoItWithByVal(ByVal X As TestStructure) As Integer
Dim Res As Integer = 0
With X
For Q As Integer = 1 To N
Res = Res Xor .A Xor .B Xor .C Xor .D Xor .E Xor .F Xor .G Xor .H
Next Q
End With
Return Res
End Function
Public Sub Main()
Dim Obj As New TestStructure()
Dim Start As Date, Time As TimeSpan
For Q As Integer = 1 To 4
Start = Now()
DoItByVal(Obj)
Time = Now() - Start
Console.WriteLine("DoItByVal #{0}: {1}", Q, Time.TotalMilliseconds())
Next Q
Console.WriteLine()
For Q As Integer = 1 To 4
Start = Now()
DoItByRef(Obj)
Time = Now() - Start
Console.WriteLine("DoItByRef #{0}: {1}", Q, Time.TotalMilliseconds())
Next Q
Console.WriteLine()
For Q As Integer = 1 To 4
Start = Now()
DoItWithByVal(Obj)
Time = Now() - Start
Console.WriteLine("DoItWithByVal #{0}: {1}", Q, Time.TotalMilliseconds())
Next Q
Console.ReadKey()
End Sub
End Module
DoItByVal #1: 4157.2378
DoItByVal #2: 4150.2374
DoItByVal #3: 4151.2374
DoItByVal #4: 4150.2374
DoItByRef #1: 4193.2398
DoItByRef #2: 4191.2398
DoItByRef #3: 4190.2396
DoItByRef #4: 4196.2401
DoItWithByVal #1: 4172.2386
DoItWithByVal #2: 4158.2379
DoItWithByVal #3: 4156.2378
DoItWithByVal #4: 4161.238
ger_kar писал(а):И что прямо в одном проекте и такой и сякой код можно заюзать?Qwertiy писал(а):Си++ единственный язык, позволяющий смешивать managed и unmanaged код
Интересная концепцияQwertiy писал(а):Да. Даже в одном классе с некоторой магией
Хакер писал(а):Нет ничего подобного в С++. То что одно компания, маленькая или большая, решила выпустить расширение к языку с подобным функционалом — мало ли кто выпускает расширения к языку? Это не делает это частью С++.
Есть. Уже есть и решения других производителей для программирования под платформу Net. Тот же DelphiQwertiy писал(а):К тому же, насколько я представаляю, кроме майкрософтовского варианта, других с поддержкой managed-кода нет, верно?
Вернуться в Windows-программирование
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11