?

Log in

[darxeth digital]
View:Свежие записи.
View:Архив.
View:Друзья.
View:Личная информация.
View:Website (RSS-Feed).
View:RSS трансляция. ATOM трансляция.
You're looking at the latest 10 entries.
Missed some entries? Then simply jump back 10 entries

Tags:, , , ,
Security:
Subject:dotnet :: winforms :: рисуем однопиксельную рамку вне клиентской области контроля
Time:02:56 pm
Настроение:accomplished

Очень простой вопрос, на который очень сложно найти правильный ответ.
Т.е. в google находятся несколько методов, на они все не до конца верные.
Я разбирался несколько часов.

Сначала дам верный ответ, затем поговорю подробнее.

Q: А зачем это вообще нужно ?
A: Например, вы захотели изменить цвет рамки Label с BorderMode FixedSingle.
Или написать свой контейнер с рамкой так, чтобы граница никогда не перекрывалась внутренними контролями.

Q: Хорошо, и как нарисовать однопиксельную рамку вне клиентской области контроля ?
A: Сначала вам понадобится переопределить WndProc в своём контроле. Пример:

WmNCPaint + WndProcСвернуть )

А вот код из моего класса NonClientPaint:

NonClientPaint.DrawBorderСвернуть )

Q: А если у моего контроля нет места для рамки ?
A: Чтобы зарезервировать место для рисования рамки, перопределите CreateParams.

CreateParamsСвернуть )

Q: Когда я изменяю размер контроля, рамка не перерисовывается !
A: Для этого нужно переопределить ещё и OnResize:

OnResize+NonClientPaint.InvalidateСвернуть )

Q: SafeNativeMethods ?
A: Обычные функции WinApi (P/Invoke), организованные по приниципу, описанному здесь.

Q: Чем плохо решение, предложенное в MSDN ?
A: При этом возникают серьёзные проблемы с перерисовкой.
Части рамки остаются на других окнах и контролях (расположенных сверху данного).
Эти проблемы очень заметны, если рисовать так рамку для перетаскиваемого окна.

Q: Что такое 0x10000 (как флаг GetDCEx) ?
A: Не знаю.
Я взял этот параметр из UndocumentedGetDCEx, и без него действительно ничего не работает.

Q: Почему bounds именно такие (0, 0, Width-1, Height-1) ?
A: Width - 1 и Height - 1 соответствуют правой и нижней границам вне клиентской области.
ClientRectangle тут очевидным образом не подходит.

Q: Так ли необходима вся эта часть с hRgn2 ?
A: Насколько я понимаю, нет.
Если только контроль не рисует вне клиентской области что-то ещё (заголовок окна, например).

Q: Invalidate: Почему не сделать PostMessage(WM_NCPAINT) ?
A: Простой ответ: это не работает.
Такой метод иногда предлагают в сети, но это сообщение никогда не доходит до контроля.
Люди со Spy++ могут это проверить, люди с исходниками Windows могут это объяснить.

Q: Рамка неправильно перерисовывается под Windows 2003 Server !
A: Сам только что заметил. Как только разберусь — напишу сюда.

Q: Могу ли я разместить эти Q&A у себя на сайте ?
A: Конечно, только не забудьте упомянуть меня (Андрей Щёкин) и этот журнал.

.netgdiwinapihowtowindows_forms
comments: 1 комментарий or Оставить комментарий Поделиться

Security:
Subject:dotnet :: nativemethods
Time:03:13 am
В замечательной программе FxCop с версии 1.312 появилось новое правило:
MovePInvokesToNativeMethodsClass.

Оно советует распределить все объявления внешних unmanaged функций по трём классам:
SafeNativeMethods, NativeMethods и UnsafeNativeMethods.

Microsoft более менее чётко придерживается этого правила в BCL .Net Framework.

Классы различаются следующим:

SafeNativeMethods - к классу применяется аттрибут [SuppressUnmanagedCodeSecurity].
О безопасности вызовов можно не думать вообще.

NativeMethods - к классу не применяется аттрибута [SuppressUnmanagedCodeSecurity].
В этот класс обычно попадают константы и типы данных (почему methods - не знаю).

UnsafeNativeMethods - к классу применяется аттрибут [SuppressUnmanagedCodeSecurity].
О безопасности вызовов думает непосредственно производящий вызов.

Под безопасностью имеются в виду проверки "клиента" нашей библиотеки на наличие необходимых прав.

Самое интересное в этой истории - аттрибут [SuppressUnmanagedCodeSecurity].
Без FxCop я бы нескоро задумался о том, зачем он нужен.
А он, на самом деле, очень и очень полезен.

Этот аттрибут применяется к классу, содержащему методы P/Invoke или непосредственно к методу.
Он отключает полную проверку стека на permission обращения к unmanaged коду.

Да-да. Если его не применить, каждый вызов метода P/Invoke будет приводит к полному просмотру стека !
Мелочь, но производится эта проверка вовсе не мгновенно.

Так что MovePInvokesToNativeMethodsClass !

<обновляемая версия: MovePInvokesToNativeMethodsClass@npj>

.netexplanationsperformanceinterop
comments: Оставить комментарий Поделиться

Security:
Subject:dotnet :: designtime
Time:03:44 am
Новые веяния в кодировании изображений aka небольшие глюки кодогенерации:

this.imageListFixer.SetImagesData(this.imageList, new System.Byte[] {
   ((System.Byte)(0)),

   // пропущено ~500 строк

   ((System.Byte)(0)),     
   ((System.Byte)(255)),
   ((System.Byte)(153)),                                                             
   ((System.Byte)(51)),
   ((System.Byte)(0)),
   ((System.Byte)(255)),
   ((System.Byte)(204)),
   ((System.Byte)(0)),
   ((System.Byte)(0)),
   ((System.Byte)(255)),
   ((System.Byte)(0)),
   ((System.Byte)(0)),

   // пропущено ещё ~500 строк                     
                                              
   ((System.Byte)(0))});


Visual Studio стало, кхм, нехорошо;)

.net design_time funny_bugs
comments: 6 комментариев or Оставить комментарий Поделиться

Security:
Subject:ramblings :: architecting
Time:01:24 am
Настроение:amusedamused
Скачал новый .Net Framework (2.0 beta). Оставим пока в стороне generics и прочее.
Поговорим о новых классах из System.Net.Mail и System.Net.Mime.

Один из проектов, над которыми я работаю, называется PocketMail.
Это набор классов для работы с почтой под .Net CF, по смыслу аналогичный вышеупомянутым.

API и внутреннюю структуру PocketMail я проектировал полностью сам.
Так что очень интересно было посмотреть на вариант от Microsoft.
Результат меня немало удивил и порадовал.

Значительная часть внешнего API и решения в особо сложных местах реализации совпадают один в один !
А я считаю архитекторов Microsoft одними из лучших в деле проектирования API.
Так что очень приятно всё же.

.netramblingswhidbey
comments: 4 комментария or Оставить комментарий Поделиться

Tags:, ,
Security:
Subject:dotnet :: article
Time:12:32 am
Настроение:accomplished
эта запись создана специально для комментариев к моей статье:
Visual Basic 2005 "Whidbey". Новые синтаксические конструкции.

Комментарии приветствуются, только не забывайте подписываться.

.netvbwhidbey
comments: 5 комментариев or Оставить комментарий Поделиться

Tags:
Security:
Subject:notifications :: brainbench
Time:12:24 am
Настроение:satisfiedsatisfied
Вот, кстати, новость, которая может показаться весьма интересной.
Brainbench открыл свободный доступ ко всем своим тестам с 1 по 15 этого месяца.
Пользу этого, я думаю, обьяснять не надо.

Ссылка на результаты подобного теста в CV лишней никогда не будет.

Уже получил мастера по Perl'у, пойду с .Net разбираться ;)
Update: +VB .Net, мастер (4.4/5.0)
Update: +C#, мастер (4.17/5.0) - плохой результат, на самом деле.

Update: Ерунда какая-то эти сертификаты - что не пройду, так сразу в их Top попадаю ! ;)
А если серьёзно, то половину каждого можно сдать на Google. Ловкость рук, товарищи !

    

    



brainbench

comments: 2 комментария or Оставить комментарий Поделиться

Security:
Subject:dotnet :: winforms :: finding the component container
Time:02:59 am
Настроение:tiredtired
В процессе подготовки к экзамену по матфизике задался интересным вопросом.
Пусть у нас есть компонент (Component). Мы хотим, чтобы он получал уведомления о событиях от всех контролов определённого типа (скажем, события TextChanged всех TextBox'ов), находящихся на той же форме.

Для этого нам нужно перечислить все TextBox'ы на этой форме, и подключить наш обработчик к желаемому событию. В первом приближение для компонента это можно сделать так:

private void AttachEvents()
{
    IContainer container = this.Site.Container;

    foreach(Component component in container.Components)
    {
        TextBox textBox = component as TextBox;
        if(textBox == null) continue;

        textBox.TextChanged += new EventHandler(textBox_TextChanged);
    }
}


Но это решает только часть проблемы. Представим себе, что на форму были добавлены новые TextBox'ы после вызова нашей функции. Естественно, их события не будут перехвачены.

ДалееСвернуть )

.netcomponent_modeldesign_timehowto
comments: 2 комментария or Оставить комментарий Поделиться

Security:
Subject:blogs :: 42
Time:01:12 am
Настроение:accomplished
Тестовая версия моего блога теперь работает на WebMatrix.
Дизайн, возможно, излишне аскетичен - но куда менее уродлив, чем стандартный.
Пожалуй лучше мне на данный момент не сделать.

Там пока нет ничего, кроме тестов движка. Но шаг вперёд намечается.
Теперь бы его ещё заставить кросспостить в Livejournal - и наступило бы полное счастье.
comments: 9 комментариев or Оставить комментарий Поделиться

Security:
Subject:dotnet :: nullable types
Time:11:37 pm
Очень интересная дискуссия по поводу поддержки Nullable<T> в Visual C# 2.0.
Там есть пример нового синтаксиса, о котром я не знал:
int? a;
bool? b;
что аналогично обычному
Nullable<int> a;
Nullable<bool> b;
Кроме всего прочего, это очень напоминает синтаксис замечательного языка Xen.
Становится понятнее, каким образом в Xen будут работать int?, int+ и int*.

Ещё там объясняется, что возможность примения операторов к двум величинам типа Nullable<T> сделана именно на уровне компилятора. Меня давно интересовал этот вопрос, ведь стандартными средствами языков C# и VB 2005 сделать подобное перенаправление операторов невозможно.

Но дискуссия интересна не только этим, а предложением ввести типы вроде string!, для которых запрещено было бы значение null. Сделав такой запрет на уровне типа (с автоматической генерацией исключения при попытке присвоить этому типу null), можно было бы оставить основные проверки на null компилятору.

Эта идея мне, как поклоннику проверок в design time, очень нравится. Идеальной, конечно, была бы возможность куда более общие условия на значения, что-нибудь вроде restricted<0..300> int a с возможностью неявного кастинга от менее жёстких условий к более жёстким. Особенно ценная возможность для параметров процедур, конечно.

Если C# дойдёт о такой возможности, у меня почти не останется сомнений на каком языке писать.

P.S. Кстати, в комментариях упоминается странный язык Cω и есть ссылка на презентацию.
Я ничего о нём не знал, интересно.

Update: Ага, язык Cω - это просто новое название для Xen. Мда. Найти что-нибудь в Google для языка с таким названием будет непросто. Название 'X#' нравилось мне куда больше.

Update 2: Я не совсем прав - это не просто Xen, а Xen (X#) + Polyphonic C#.

.netcomegaprogramming_languageswhidbeycsharp
comments: Оставить комментарий Поделиться

Security:
Subject:сpp :: dirty tricks
Time:01:20 am
Настроение:mischievousmischievous
С++ - великий язык, но и в у его компилятора есть предел выносливости.
Меня он долго переносить не смог. Внутренняя ошибка:
d:\Development\VC_All\LJCubeModel\Vectors.h(12): fatal error C1001: INTERNAL COMPILER ERROR
        (compiler file 'msc1.cpp', line 2701) 
         Please choose the Technical Support command on the Visual C++ 
         Help menu, or open the Technical Support help file for more information
возникла при попытке скомпилировать вот этоСвернуть ).
Там, конечно, есть одна опечатка, но она же не заслуживает "INTERNAL COMPILER ERROR" ! ;)

cppfunny_bugs
comments: 8 комментариев or Оставить комментарий Поделиться

[darxeth digital]
View:Свежие записи.
View:Архив.
View:Друзья.
View:Личная информация.
View:Website (RSS-Feed).
View:RSS трансляция. ATOM трансляция.
You're looking at the latest 10 entries.
Missed some entries? Then simply jump back 10 entries