VBNet
VBMania
Голосование: Ссылки: |
Господа!!! читайте MSDN!!! Несколько слов от автора:
Хорошая погода...
Читайте! Содержание выпуска
Книги
Остальные книги о VB можно найти здесь. наверх Citycat by Email Программа Citycat by Email позволяет работать с сервером Subscribe.ru с помощью электронной почты. Теперь Вам не нужно тратить деньги на работу в online и просматривать мегабайты рекламы для того, чтобы подписаться на нужную рассылку! Вам просто необходимо скачать небольшую базу данных по всем рассылкам каталога с нашего сайта, после чего Вы сможете подписываться и отписываться от рассылок, заказывать архивы прошлых выпусков, выполнять поиск по каталогу рассылок и многое другое. Программу Citycat by Email можно бесплатно загрузить с сайта http://sapisoft.h1.ru. наверх Новости сайта VBNet
Последние 20 тем форума на VBNet.Ru: 13:57 / 17 июн. Как из VB достать дату из BIOS??? | Хитов: 0 | Ответов: 0 13:55 / 17 июн. Новое сообщение без темы | Хитов: 2 | Ответов: 0 13:55 / 17 июн. Новое сообщение без темы | Хитов: 1 | Ответов: 0 11:48 / 17 июн. MSHFlexGrid - как по ячейкам удобней бегать? | Хитов: 4 | Ответов: 1 11:47 / 17 июн. Access report update | Хитов: 4 | Ответов: 0 10:11 / 17 июн. как нестандартные формы в vb.net | Хитов: 6 | Ответов: 1 07:09 / 17 июн. Этим летом Граждане Форумяне возвращаются :-))) | Хитов: 31 | Ответов: 3 06:21 / 17 июн. VB: подсчет выделенных в ListView | Хитов: 29 | Ответов: 7 22:48 / 16 июн. Подскажите что делать!? | Хитов: 34 | Ответов: 6 22:31 / 16 июн. VB+MS_EQUATION | Хитов: 11 | Ответов: 0 19:48 / 16 июн. VB и HTML-формы | Хитов: 19 | Ответов: 0 18:23 / 16 июн. БД | Хитов: 23 | Ответов: 2 15:30 / 16 июн. .NET - считывание из *.txt | Хитов: 17 | Ответов: 1 15:15 / 16 июн. ASCII в .NET | Хитов: 7 | Ответов: 0 14:57 / 16 июн. Cоздать папку в активном окне Windows | Хитов: 17 | Ответов: 0 13:48 / 16 июн. Размеры формы | Хитов: 40 | Ответов: 5 13:42 / 16 июн. ASP _ UNICOD | Хитов: 14 | Ответов: 0 12:21 / 16 июн. Сравнение цветов по RGB характеристикам | Хитов: 31 | Ответов: 4 11:59 / 16 июн. MAPI. Как расширить действие компонентов. | Хитов: 25 | Ответов: 2 10:55 / 16 июн. Файло через интернет | Хитов: 34 | Ответов: 5 Последние поступления в Библиотеку кодов: Отправка письма средствами TheBat! (50) Получение объекта Graphics для PictureBox (35) Получение текущей строки DataGrid (46) Очистка всех листбоксов на форме (23) Шифрование по алгоритму RC4. (72) Новости от VBNet-чиков!: наверх Новости сайта VBMania наверх Новости сайта Азбука VB наверх Новости сайта MSDN наверх Новости сайта GotdotNet Новые статьи: наверх Новости сайта dotSite Новые статьи:
Новые примеры: наверх Один момент из жизни форума: Как в программе сохранить настройки? Вопрос: Автор вопроса: Jen Есть программа, которая сохраняет свой настройки в самой же себе. Можно ли такое сделать на Basic? Ответы: Атор: JEDI Открываешь Для считки свой ехе и дописываешь в конец то что надо, а потом читешь! Автор: E-Man 'ЗАПИХАТЬ: open app.path & "\" & app.exename for binary as #1 a=vbcrlf & "###" put #1,lof(1)+1,a a= "12345" close 1 'ВЫТАЩИТЬ: open app.path & "\" & app.exename for binary as #1 do line input #1, a loop until a="###" line input #1,a msgbox a 'вылезет окно 12345 close 1 Код писал не в IDE - если че подправь... наверх Доска объявлений Ищу телеработу.
наверх Мои программы BalloonMessage for MS Agent BalloonMessage for Microsoft Agent реализует диалог программы с
пользователем, используя при этом технологию Microsoft Agent. OCX реализует три
типа диалоговых окон: InputBox, MsgBox и MsgLabels. Авторы: Шатрыкин Иван и Павел Сурменок. наверх Вопрос/Ответ Здесь Вы можете задать вопрос, или ответить на уже имеющиеся вопросы. Вопросы:Автор вопроса: Maxim Ответ ожидается по этому адресу Как сделать, чтобы скрытые папки отображались в DirListBox’e? Автор вопроса: Rex Ответ ожидается по этому адресу Как в реестре (в любое его место) записать, прочитать, удалить ключи и значения? Автор вопроса: Алексей Самарцев Ответ ожидается по этому адресу Как работая напрямую с объектами ADODB.Connection и ADODB.Recordset выполнить асинхронный запрос к БД? Автор вопроса: Вячеслав Л. Ответ ожидается по этому адресу Как для элемента DataGrid програмно задать формат столбца? Автор вопроса: Maxim Ответ ожидается по этому адресу Помогите написать код программы который при наведении курсора на папку в Explorer показывал бы ее размер на Form. Или хотя бы ссылку на инфу или исходники или API функции которыми можно воспользоваться. Ответы: Вопрос: У немя возник тут такой вопрос Как сделать так что-бы можно было обводить несколько контролов во время работы программы (типа как в VB во время разработки) Ответ: Автор ответа: valix load command(command1.count) with command1(command1.count - 1) .visible = true .move rnd * 500,rnd * 500 .caption = command1.count - 1 end with Вопрос: Подскажите пожалуйста или пришлите кусочек исходника как считать данные из памяти или записать при помощи VB Ответ: Автор ответа: CRAZYDIMA Что конкретно необходимо записать в память и куда? Можешь использовать функцию CopyMemory, описание в МСДН. Вот пример программки, читающей весь файл и отображающей её на некоторую область памяти т.н. filemapping. А затем программа работает с выделенной областью памяти. Тело модуля: Option Explicit Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Public Declare Function FlushFileBuffers Lib "kernel32" (ByVal hFile As Long) As Long Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Public Const GENERIC_READ = &H80000000 Public Const GENERIC_WRITE = &H40000000 Public Const FILE_SHARE_READ = &H1 Public Const FILE_SHARE_WRITE = &H2 Public Const OPEN_EXISTING = 3 Public Declare Function CreateFileMapping Lib "kernel32" Alias "CreateFileMappingA" (ByVal hFile As Long, ByVal lpSecurityAttributes As Long, ByVal flProtect As Long, ByVal dwMaximumSizeHigh As Long, ByVal dwMaximumSizeLow As Long, ByVal lpName As String) As Long Public Const PAGE_NOACCESS = &H1 Public Const PAGE_READONLY = &H2 Public Const PAGE_READWRITE = &H4 Public Const PAGE_WRITECOPY = &H8 Public Const PAGE_EXECUTE = &H10 Public Const PAGE_EXECUTE_READ = &H20 Public Const PAGE_EXECUTE_READWRITE = &H40 Public Const PAGE_EXECUTE_WRITECOPY = &H80 Public Const PAGE_GUARD = &H100 Public Const PAGE_NOCACHE = &H200 Public Declare Function MapViewOfFile Lib "kernel32" (ByVal hFileMappingObject As Long, ByVal dwDesiredAccess As Long, ByVal dwFileOffsetHigh As Long, ByVal dwFileOffsetLow As Long, ByVal dwNumberOfBytesToMap As Long) As Long Public Const SECTION_EXTEND_SIZE = &H10 Public Const SECTION_MAP_EXECUTE = &H8 Public Const SECTION_MAP_READ = &H4 Public Const SECTION_MAP_WRITE = &H2 Public Const SECTION_QUERY = &H1 Public Const FILE_MAP_COPY = SECTION_QUERY Public Const FILE_MAP_READ = SECTION_MAP_READ Public Const FILE_MAP_WRITE = SECTION_MAP_WRITE Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Public Declare Function UnMapViewOfFile Lib "kernel32" Alias "UnmapViewOfFile" (ByVal lpBaseAddress As Long) As Long 'получает параметром путь к файлу(любому) Sub FileRead(sFileName As String) Dim iFileSize As Long Dim iFileHandle As Long Dim iFileMappingHandle As Long Dim iFileBaseAddress As Long Dim iFileEndAddress As Long Dim bFile() As Byte Dim bChar As Byte Dim i As Long Dim sString As String Dim iReturnValue As Long 'это размер файла iFileSize = FileLen(sFileName) ' открывает существующий файл iFileHandle = CreateFile(sFileName, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, 0&, OPEN_EXISTING, 0&, 0&) ' создает объект маппинга iFileMappingHandle = CreateFileMapping(iFileHandle, 0&, PAGE_READWRITE, 0&, iFileSize, 0&) 'получает базовый адрес памяти iFileBaseAddress = MapViewOfFile(iFileMappingHandle, FILE_MAP_WRITE, 0&, 0&, 0&) 'получает общий размер выделенной памяти iFileEndAddress = iFileBaseAddress + iFileSize ' в цикле ксорит весь файлик по 7 и соответственно записфывает обратно For i = iFileBaseAddress To iFileEndAddress 'скопировать в переменную байт Call CopyMemory(bChar, ByVal i, 1) 'отксорить его по 7 bChar = bChar Xor 7 ' записать обратно в файл Call CopyMemory(ByVal i, bChar, 1) Next i 'закрыть все дескрипторы iReturnValue = UnMapViewOfFile(iFileBaseAddress) iReturnValue = CloseHandle(iFileMappingHandle) iReturnValue = CloseHandle(iFileHandle) End Sub Вопрос: Скажите, пожалуйста, как сделать контрол DirListBox в виде проводника? Ответ: Автор ответа: CRAZYDIMA Никак!!! DirListBox - это готовый контрол! Чтобы его исправить тебе нужен его исходник. Легче написать свой контрол, который будет представлять совокупность двух - TreeView и ListView. Синхронизируй их работу и дерзай! Вопрос: Как можно в проге сделать так, чтобы она была поверх всех окон (как у StatWin 5.5), и запретить или что-то в этом роде доступ к другим программам(меню и др.) кроме этой. И как скрыть её от Ctrl+Alt+Del? Если знаете, то киньте мне на мыло или опубликуйте здесь. Ответ: Автор ответа: CRAZYDIMA 'Функция нерегистрации приложения Public Declare Function RegisterServiceProcess Lib "kernel32" (ByVal dwProcessId As Long, ByVal dwType As Integer) As Long 'вызов Call RegisterServiceProcess(0, 1) '***************************************************************** НО БУДЬ ОСТОРОЖЕН! В ВинНТ она не сработает, вызвав ошибку вызова несуществующей функции из кернел32. Поэтому советую проверить перед вызовом ОС. '***************************************************************** Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long Public Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End Type Public Const VER_PLATFORM_WIN32_WINDOWS = 1 'полный вызов с проверкой Dim udtOSVer As OSVERSIONINFO udtOSVer.dwOSVersionInfoSize = Len(udtOSVer) Call GetVersionEx(udtOSVer) If udtOSVer.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then Call RegisterServiceProcess(0, 1) End If Ответ: Автор ответа: valix Public Const HWND_TOPMOST = -1 Public Const HWND_NOTOPMOST = -2 Public Const SWP_NOACTIVATE = &H10 Public Const SWP_SHOWWINDOW = &H40 Public Const SWP_NOMOVE = &H2 Public Const SWP_NOSIZE = &H1 Declare Sub SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) 'Поверх всех окон SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE 'Не поверх всех окон SetWindowPos Me.hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Вопрос: У меня пара вопросиков: 1. Возможно ли сделать под VB форму нестандартной геометрии? К примеру, с отверстиями, скруглёнными краями и т.п. В Delphi такая фишка имеется. Если можно, примерчик пжалста... 2. Как проверить, существует ли такая-то директория или файл в ней? Ответ: Автор ответа: CRAZYDIMA По твоему второму вопросу: Создай объект FileSystemObject.(Project->References->Microsoft Scripting RunTime), а дальше так: Dim fso As New FileSystemObject Dim bFolderExist As Boolean Dim bFileExist As Boolean bFolderExist = fso.FolderExists("c:\DISTR") bFileExist = fso.FileExists("c:\autoexec.bat") Иначе воспользуйся встроенной функцией ВБ - Dir. Возващает имя файла или пустую строку. Ответ: Автор ответа: Nechaev Sergey 1. посмотри в сети - там много всего на эту тему. Я даже где-то видел класс, которому даешь картинку и форму, он вырезает на форме картинку, делая дырку на месте белого цвета. 2. просто попытайся обратиться к этой директории и отлови ошибку Доступ закрыт или путь не существует (номер не помню, посмотри). Если ошибка произошла, значит директория не создана, если обращение прошло нормально, значит папка есть. Ответ: Автор ответа: Maxim На Vbnet.ru есть статья про окна нестандартной формы. А чтобы проверить, существует ли файл/папка используй Dir(PathToYourFile). Если возвращает пустую строку, значит файла нет. Ответ: Автор ответа: Oleksandr 1. Да можно Напривет элиптическую - при помощи CreateEllipticRgn и Set WindowRgn API-функций private sub form_load() dim region as long region=CreateEllipticRgn(0,0,200,100) Set WindowRgn hWnd,region, true end sub 2. Открываешь файл и проверяешь, если ошибки нет (Err.Number=0) - файл существует. Ответ: Автор ответа: Vao Привет! Для начала ответ на второй вопрос: Используй функцию CurDir Пример: Const testBD = "tm1.tmb" Const rezBD = "tm2.tmb" Private Sub Form_Load() 'при загрузке определяем текущий каталог и проверяем наличие в нем файлов БД If Len(Dir(CurDir & "\" & testBD)) > 0 And Len(Dir(CurDir & "\" & rezBD)) > 0 _ Then Test_Connect_Path = "Provider=Microsoft.Jet.oledb.4.0; Data Source=" & CurDir & "\" & testBD Rez_Connect_Path = "Provider=Microsoft.Jet.oledb.4.0; Data Source=" & CurDir & "\" & rezBD Else WrongTimer.Enabled = True End If End Sub А теперь ответ на второй вопрос (эта инфа по поводу нестандартных форм заимствована из статьи Сергея Миллера.) ---Начало цитаты--- "Создание нестандартных окон - это просто! В Visual Basic очень легко создавать простые виндосовские окна! Но ведь они такие прямоугольные серые и некрасивые... К сожалению в VB нет интегрированных методов решения этой проблемы и нам приходится прибегать к помощи API-функций. В этой статье я покажу почти все возможности использования регионов: регионы любой формы, регионы с загруглёнными углами и комбинирование регионов! Итак, начнём! Окна любых форм 1.Конечно же нужно создать стандартный EXE-проект. Теперь создайте единственный на форме объект Image. Назовём его stern. 2.Так, начнём с создания регионов любой формы. Мне кажется красивее будет если на форме будет рисунок, вокруг которого мы и "отрежем" лишнее. Поэтому запустим Paint, аттрибуты рисунка установим 249 по высоте и 313 по ширине. Теперь нарисуем самый угловатый рисунок - звёздочку (как у октябрят :)), примерно такую: Кто очень талантливый может посерёдке нарисовать вoждя мирового пролетариата - на регионы это никак не повлияет :)))! 3.Сохраните рисунок. Теперь объекту image по имени stern присвоим этот рисунок. 4.Присвоили? Теперь сдвиньте его подальше вниз за пределы формы, чтобы он не мешался, а размеры формы установите равными: Width = 4710, Height = 3780. В свойстве BorderStyle установите флажок 0-None. Свойство AutoRedraw установите равным True. Готово! Теперь приступим к созданию! 5.Сделайте двойной клик по форме и впишите в раздел General Declarations: Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd _ As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint _ As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long Private Type POINTAPI X As Long Y As Long End Type Dim P(10) As POINTAPI Теперь объясню зачем это. Первая API-функция SetWindowRgn так сказать накладывает созданный регион на окно. Те части которые остались за пределами региона исчезают. Знаете с чем это можно сравнить? Есть такие специальные жестянные формочки для выпечки печения. Они все в форме всяких цветков, звёздочек, колокольчиков и т.д. Так вот я видел пару раз как ими работают: лежит, например, на столе кусок теста и человек просто ложит эти острые формочки на него и выдавлевает формы этих самых цветков, звёздочек, колокольчиков!!! По такому же принципу и взамодействует окно с регионом. Наша же задача - это именно создание "формочки" для формы ;) Передаваемые значения это: hwnd - идентификатор окна, на котором нужно "выдавить" форму hRgn - "формочка" для окна bRedraw - перерисовывать ли окно после "выдавления"? Для того, чтобы создать регион-"формочку" нам нужна вторая вторая API-функция CreatePolygonRgn. Состоит регион из n-ого количества точек, которое Вы и должны задать! Т.е., например, что бы описать звезду, нам нужны все её точки, как внутрение, так и наружние. Как их всех найти мы рассмотрим позже, а сейчас посмотрим на параметры: lpPoint - первая точка региона. nCount - количество точек nPolyFillMode - описание метода заливки полигона Каждая точка на форме, как известно, имеет свои координаты - по иксу и по игреку. Поэтому каждая точка должна содержаться в переменной-ящичке POINTAPI. Всего точек у звезды десять (5 внутренних и пять наружних), но регион это замкнутая форма, поэтому какaя-то точка будет подсчитана дважды, как первая и как последняя. Итак нам нужны одиннадцать точек и каждая имеет свои координаты. Для этого-то мы и объявили массив P по типу POINTAPI. В скобках стоит десять, но, т.к. счёт идёт у Бэйсика с нуля, то и значений в нём одиннадцать. 6.А теперь в событие Form_Load впишем: Picture = stern Строка выглядит немного странновато, да. Зато короче уже не придумаешь. Это значит: Me.Picture = stern.Picture Умный VB определил, что свойству формы Picture ничего не нужно, как такого же вида свойство. Это можно делать со строковыми свойствами: Label1 = "ABCVB" Но это не относится к теме. Теперь при загрузки формы на ней будет появляться звезда. 7.А вот теперь нам надо найти все точки, вокруг которых будет описан регион. Снова кликаем на форме и в окне Code в раздел General Declarations временно объявляем переменную-счётчик m, которая будет подсчитывать и подставлять точки региона: Dim m As Integer Теперь выбираем событие Form_MouseDown и вписываем: Private Sub Form_MouseDown(Button As Integer, Shift As Integer, _ X As Single, Y As Single) Debug.Print "P(" & m & ").X=" & X / Screen.TwipsPerPixelX _ & ":" & "P(" & m & ").Y=" & Y / Screen.TwipsPerPixelY m = m + 1 End Sub Что делает эта процедура? Нет, сначала объясню, что должны сделать Вы. Вам нужно запустить проект и клинуть на каждой из одиннадцати кнопок звёздочки, а процедура Mouse_Down будет в свою очередь генерировать код присвоения каждой точкe её координат в пикселах. Код потом можно будет прямо вставить в программу. Появляться будут строки примерно следующего содержания: P(0).X = 132: P(0).Y = 6 P(1).X = 173: P(1).Y = 64 P(2).X = 303: P(2).Y = 71 P(3).X = 213: P(3).Y = 123 P(4).X = 291: P(4).Y = 241 P(5).X = 157: P(5).Y = 154 P(6).X = 5: P(6).Y = 239 P(7).X = 78: P(7).Y = 103 P(8).X = 10: P(8).Y = 58 P(9).X = 100: P(9).Y = 60 Так было у меня. Теперь вырежте этот код в событие Form_Load и уже вручную допишите код первой-последней точки с координатами точно, как у первой точки: P(10).X = 132: P(10).Y = 6 8.Теперь строку Dim m As Integer и событие Form_MouseDown удалите вообще - они нам больше не нужны - координаты точек у нас есть. Тепeрь осталось всего-то создать регион и выдавить его на форме! В событие Form_Load допишем под присвоением координaт точек: Dim Rgn As Long Эта переменная будет содержать регион. Теперь чуть ниже впишем строку создания региона: Rgn = CreatePolygonRgn(P(0), 10, 0) и ещё чуть ниже выдавливем форму: Call SetWindowRgn(hwnd, Rgn, True) Готово! Теперь просто запускаем. Любуемся! По этому ёе принципу можно создавать окна немысленных форм!!! Конечно, чем больше задано точек, тем красивее и точнее будет форма. Так же можно создавать точки во время передвижения мыши по форме. Точек будет конечно же много, но Вам ведь нужно просто их переставить в другое окно и всё! Сделать это надо так: В разделе General Declarations объявляем переменную Dim IfMove As Boolean Dim m As Integer Теперь вставьте три следующих события чуть ниже: Private Sub Form_MouseUp(Button As Integer, Shift As _ Integer, X As Single, Y As Single) IfMove = False End Sub Private Sub Form_MouseDown(Button As Integer, Shift _ As Integer, X As Single, Y As Single) IfMove = True End Sub Private Sub Form_MouseMove(Button As Integer, Shift As _ Integer, X As Single, Y As Single) If IfMove Then Debug.Print "P(" & m & ").X=" & X / Screen.TwipsPerPixelX _ & ":" & "P(" & m & ").Y=" & Y / Screen.TwipsPerPixelY m = m + 1 End If End Sub А теперь последняя проблемка - передвижение формы по экрану! Объявим переменную, проверяющую двигается ли мышь и две переменные для значений положения мышки во время нажатия и добавим три процедуры: Dim IfMove As Boolean Dim X1 As Integer Dim Y1 As Integer Private Sub Form_MouseDown(Button As Integer, Shift _ As Integer, X As Single, Y As Single) IfMove = True X1 = X Y1 = Y End Sub Private Sub Form_MouseUp(Button As Integer, Shift As _ Integer, X As Single, Y As Single) IfMove = False End Sub Private Sub Form_MouseMove(Button As Integer, Shift As _ Integer, X As Single, Y As Single) If IfMove Then Move Left + X - X1, Top + Y - Y1 End If End Sub А вот второй способ осуществим при помощи API функции SendMessage. В раздел General Declarations допишем следующие API-функции: Private Declare Function SendMessage Lib "user32" Alias _ "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, lParam As Any) As Long 'эта функция "захватывает" мышку для выполняемого задания 'зачем - не знаю сам! Неужели нельзя договориться? :-))) Private Declare Sub ReleaseCapture Lib "user32" () Добавим процедуру передвижения иышки: Private Sub Form_MouseMove(Button As Integer, Shift As _ Integer, X As Single, Y As Single) 'если была нажата левая кнопка вызываем процедуры If Button = 1 Then Call ReleaseCapture Call SendMessage(hwnd, &HA1, 2, 0&) End If End Sub Окна c закругленными углами А вот это ещё проще! А всё-таки тоже необычно - часто Вы встречаете окна с закругленными углами??? 1.В раздел General Declarations допишем следующую API-функцию: Private Declare Function CreateRoundRectRgn Lib "gdi32" _ (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, _ ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long Её параметры: X1,Y1 - координаты верхней левой точки прямоугольника, углы которого надо закруглить X2,Y2 - координаты нижней правой точки X3 - ширина овала, применяемого для закругления углов Y3 - его высота 2.Теперь попробуем создать такой. В событии Form_Load закомментируйте строку Picture = stern, чтобы картинка больше не появлялась. А под строкой Dim Rgn As Long объявите ещё одну переменную для региона: Dim Rgn2 As Long Теперь создадим второй регион: Rgn2 = CreateRoundRectRgn(0, 0, Width / Screen.TwipsPerPixelX, _ Height / Screen.TwipsPerPixelY, 50, 50) В качестве аргументов мы передаём координаты формы в пикселах а высоту и ширину овала задаём одинаковой, тем самым углы будут именно закруглены, а не "заовалены" :). Теперь чуть ниже вставьте эту строку, окраски формы в красный цвет: BackColor = QBColor(12) И строку Call SetWindowRgn(hwnd, Rgn, True) исправьте на Call SetWindowRgn(hwnd, Rgn2, True) Запускайте! Потрясающе, неправда ли !? Но вот если бы была ещё рамка, было бы просто неотразимо. Но ведь это тоже осуществимо! Правда совсем не такая, как у стандарного окна, но всё-таки! 3.Для этого можно применить API-функцию FrameRgn. Итак, под все остальные API-функции допишем ещё одну: Private Declare Function FrameRgn Lib "gdi32" (ByVal hDC As Long, _ ByVal hRgn As Long, ByVal hBrush As Long, ByVal nWidth As Long, _ ByVal nHeight As Long) As Long Передаваемые параметры: hDC - handle Device Context (я не понимаю что это, но что-то на подобии hWnd - может идентификатор какой?...) hRgn - регион, который надо "обрамить" hBrush - что это за "щётка" не понимаю тоже, но её надо прежде тоже создать (!) скорее всего это вид рисования рамки. nWidth, nHeight - толшина рамки по высоте и ширине И, как я уже сказал, нам нужна ещё одна API-функция для создания "щётки" (дописываем под первую): Private Declare Function CreateSolidBrush Lib "gdi32" _ (ByVal crColor As Long) As Long Внимание! Для FrameRgn тоже нужен регион! Ведь рамку можно нарисовать и на квадратном окне и выглядеть она будет в зависимости от региона. Теперь в событие Form_Load перед строкой Call SetWindowRgn ... вставьте строку Call FrameRgn(hDC, Rgn, CreateSolidBrush(QBColor(0)), 3, 3) Запускайте! Комбинирование регионов А ещё регионы можно комбинировать! Нужно это правда не так часто но, когда вам нужна форма с одной стороны полукруглая, а с другой выперающие углы, штыри и т.д., то без комбинирования регионов Вам уже не обойтись! Прежде чем начать введите в Genral Declarations: Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn _ As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal _ nCombineMode As Long) As Long Параметры: hDestRgn - регион, которому возвращается полученный результат из двух регионов hSrcRgn1 - первый регион hSrcRgn2 - второй регион nCombineMode - методы комбинирования Сами методы (есть ещё несколько, но эти самые основные): 'отображаются только те точки, которые принадлежат 'одному И второму региону Const RGN_AND = 1 'отображаются только те точки, которые принадлежат 'к хотябы одному региону Const RGN_OR = 2 'отображаются только те точки, которые принадлежат 'ТОЛЬКО одному из двух регионов Const RGN_XOR = 3 'отображается разница регионов, "остатки" одного от другого Const RGN_DIFF = 4 Так, теперь можно было бы скомбинировать регионы и для эффективности они должны быть разные по размерам, т.к. звезда полностью умещается в форме с закругленными углами. Поэтому исправьте строку: Rgn2 = CreateRoundRectRgn(0, 0, Width / Screen.TwipsPerPixelX, _ Height / Screen.TwipsPerPixelY, 50, 50) на Rgn2 = CreateRoundRectRgn(0, 0, (Width / Screen.TwipsPerPixelX) - 100, _ (Height / Screen.TwipsPerPixelY) - 100, 50, 50) Т.е. регион был уменьшен на сто никселов. Всё, осталось теперь только поместить следующую строку в тоже событие Form_Load, но перед строкой Call SetWindowRgn...: Call CombineRgn(Rgn2, Rgn, Rgn2, RGN_OR) В этом случае регион, в который будет помещён результат мы взяли формы с круглыми углами и метод комбинирования выбрали RGN_OR, т.е. будут отображены все точки, которые принадлежат к хотябы одному из регионов. А создание круглых и овальных регионов я уже рассматривал в примере изменения контуров формы и это ещё проще. Теперь пробуйте, эксперементируйте наслаждайтессссь... :) Ну, - как говорил Алексей Булдаков в "Осебенностях национальной охоты", - всё, что знал, рассказал!" ---Конец цитаты--- Вопрос: Как определить координаты курсора в TextBox или RichTextBox (т.е. номер текущей строки и номер текущего символа на этой строке) с последующей их передачей в StatusBar. Это нужно для контроля при вводе форматированных данных Ответ: Автор ответа: InvisibleMan Используй свойство SelStart в TextBox. 'a = Text1.SelStart Вопрос: Некоторые программы, которые я создал,ну не как не хотят запускаться на "компе" моего друга. При запуске выдаётся ошибка о повреждённом файле динамической библиотеки. Кто знает, подскажите в чём дело? Ответ: Автор ответа: InvisibleMan На "компе" твоего друга нет библиотек и/или контролов, необходимых для работы твоих программ. Чтобы всё было, используй Package & Deployment Wizard из пакета Microsoft Visual Basic 6.0 Tools Ответ: Автор ответа: .::neo::. А ты попробуй на компе твоего друга зарегистрировать библиотеку regsvr32 MSVBVM32.DLL. Ответ: Автор ответа: Nechaev Sergey Раз выдается соответствующее сообщение, значит файл или вообще отсутствует, или имеет неверную версию либо поврежден. Принеси от себя рабочий файл и положи на место глючного. Ответ: Автор ответа: Vladimir [PRC] Скорее всего разные версии библиотек, просто скопируй DLL или OCX на которую ругается прога со своего компьютера на второй или создай дистрибутив приложения и установи прогу установщиком он сам установит все файлы. Ответ: Автор ответа: Vao Видимо у твоего друга никогда не стоял...VB. Поэтому на его компе нет нужных библиотек. Есть замечательная утилита VB Power Wrap, которая позволяет запаковать в EXEшник все необходимые dll-ы и ocx-ы . Если надо вышлю. Можете заполнить эту форму, либо отослать вопрос СЮДА Форма для добавления нового вопроса в этот раздел. Информация отсылается по E-mail владельцу сайта. |
|||||||||||||||||||||||||
Выпуск подготовили: |
Сурменок Павел |