Vấn đề thể hiện kích thước chữ (Label, button, checkbox...) trên WinForm (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

giaiphap

==(^o^)==
Tham gia
12/3/07
Bài viết
5,809
Được thích
6,367
Donate (Momo)
Donate
Giới tính
Nam
Tôi có vấn đề mà chưa biết cách khắc phục, nhờ các thành viên ai có kinh nghiệm trợ giúp tôi với.
Tôi viết Add-Ins cho Excel bằng C#, ở máy tính của mình thì nó thể hiện đúng như mình thiết kế, nhưng sang máy khác thì kích thước chữ của các đối tượng (Label, checkbox, button...) trên WinForm đều thể hiện to hơn bình thường (to hơn mình thiết kế ở máy của mình). Vấn đề này tôi cũng từng gặp khi viết ứng dụng Windows nhưng đến thời điểm hiện tại vẫn chưa biết cách khắc phục, vậy có thành viên nào có kinh nghiệm về vấn đề này có thể hỗ trợ tôi khắc phục với, hoặc có gợi ý nào để tôi tham khảo với.
Dưới đây là một số ảnh kích thước chữ bị to dẫn đến trường hợp không thể hiện hết nội dung cần thể hiện.
H3.jpg
H2.jpg
H1.jpg
 
Có thể do một số máy tính thiết lập độ hiển thị hơn 100% nên xảy ra hiện tượng này !
 
Có thể do một số máy tính thiết lập độ hiển thị hơn 100% nên xảy ra hiện tượng này !
Vấn đề ở đây là mình cần điều chỉnh ứng dụng mình sao cho phù hợp với độ phan giải của máy người khác. Mình không muốn điều chỉnh máy của họ mà cần phải tự điều chỉnh ứng dụng của mình nó sẽ hay hơn. Còn nếu bí quá thì cho phép người dùng tùy chỉnh kích thước hiển thị size các control theo máy tính của họ.
 
Lập trình giao diện người dùng thì "ăn ngủ chung" với DPI đó anh
Thử với từ khóa "WinForm DPI"
Hoặc học hỏi mã nguồn các ứng dụng khác NotePad++ hoặc PowerToys
 
Từ Windows 10 trở lên nó hỗ trợ zoom màn hình với các tỷ lệ như 100%, 125%, 150%, 200%, 250%,... Cái này thuộc khái niệm DPI. Các phần mềm lập trình thông thường thì chỉ chạy đúng khi để 100%. Các IDE mới như Visual Studio, RAD Studio họ đều hỗ trợ tự động hóa điều chỉnh size các controls của họ theo DPI nên nếu dùng thuần các controls của IDE thì không bị lỗi. Nếu bạn dùng các controls của bên thứ ba thì tìm hiểu họ đã cập nhật phần tự điều chỉnh DPI chưa, phiên bản nào hỗ trợ thì bạn dùng. Nếu bạn chưa có kinh nghiệm xử lý DPI hoặc tránh mất nhiều công phải tự xử lý thì nên tránh dùng các controls lạ. Form bạn xây dựng hình như còn dùng cả SetWindowRgn theo ảnh, vụ này cũng sẽ mất nhiều công xử lý DPI đó.
 
Từ Windows 10 trở lên nó hỗ trợ zoom màn hình với các tỷ lệ như 100%, 125%, 150%, 200%, 250%,... Cái này thuộc khái niệm DPI. Các phần mềm lập trình thông thường thì chỉ chạy đúng khi để 100%. Các IDE mới như Visual Studio, RAD Studio họ đều hỗ trợ tự động hóa điều chỉnh size các controls của họ theo DPI nên nếu dùng thuần các controls của IDE thì không bị lỗi. Nếu bạn dùng các controls của bên thứ ba thì tìm hiểu họ đã cập nhật phần tự điều chỉnh DPI chưa, phiên bản nào hỗ trợ thì bạn dùng. Nếu bạn chưa có kinh nghiệm xử lý DPI hoặc tránh mất nhiều công phải tự xử lý thì nên tránh dùng các controls lạ. Form bạn xây dựng hình như còn dùng cả SetWindowRgn theo ảnh, vụ này cũng sẽ mất nhiều công xử lý DPI đó.
Đúng như anh nói em dùng bộ Control của bên thứ 3, còn vụ DPI để em nghiên cứu thử.
 
Tôi chỉ khuyên chút còn nghe hay không thì tùy

1/ Tôi thấy trên VB6 tốn quá nhiều bài dài lê thê nói về xử lý DPI khi ai đó tự tạo các Controls

2/ Nên sử dụng cái có sẳn mặc định trên bất cứ ngôn ngữ nào mà dùng cho lành

3/ kẹt quá bất đắc dĩ mới sử dụng đồ của bên thứ 3 khi ta không có khả năng viết ra nó hay chi phí viết ra nó mất nhiều thời gian

thì nên sử dụng cho nhanh vì mục đích xxx gì đó còn không thì cũng bỏ đi cho lành

tạm vậy đi
 
Em thì hay làm kiểu phóng kích thước và vị trí x, y của control theo một kích thước mốc (thường thì em lấy theo kích thước của winform) khi load theo một tỉ lệ khác thì kích thước control nó cũng được tính lại và thay đổi theo
 
Nhờ sự gợi ý của @HeSanbi@Nguyễn Duy Tuân em đã cấu hình được sản phẩm chạy ngon cành đào rồi, đúng là DPI giờ mình mới biết, trước giờ toàn lập trình ra sản phẩm đều bị lỗi size chữ như thế mà không biết cách sửa, hôm nay học được bài học lớn.
Sẳn đây cho hỏi thêm câu hỏi nửa (khỏi lập Topic mới), trong ứng dụng của tôi có lưu cấu hình vào File xml, ở máy mình chạy rất ngon nhưng sang máy khác (lúc này add-ins của mình cài vào đường dẫn C:\Program Files (x86)\VnTools Excel...) lưu vào file xml không được, toàn báo lỗi, mặc dù đọc dữ liệu từ file này bình thường. Thành viên nào biết nguyên nhân hướng dẫn mình khắc phục với. Cảm ơn các thành viên diễn này trước nhé.
 
Nhờ sự gợi ý của @HeSanbi@Nguyễn Duy Tuân em đã cấu hình được sản phẩm chạy ngon cành đào rồi, đúng là DPI giờ mình mới biết, trước giờ toàn lập trình ra sản phẩm đều bị lỗi size chữ như thế mà không biết cách sửa, hôm nay học được bài học lớn.
Sẳn đây cho hỏi thêm câu hỏi nửa (khỏi lập Topic mới), trong ứng dụng của tôi có lưu cấu hình vào File xml, ở máy mình chạy rất ngon nhưng sang máy khác (lúc này add-ins của mình cài vào đường dẫn C:\Program Files (x86)\VnTools Excel...) lưu vào file xml không được, toàn báo lỗi, mặc dù đọc dữ liệu từ file này bình thường. Thành viên nào biết nguyên nhân hướng dẫn mình khắc phục với. Cảm ơn các thành viên diễn này trước nhé.
Đã chạy quyền admin chưa?
 
Các máy tính Windows hầu hết được cài đặt bởi "cài win dạo", user đều không phải Administrator nên bị giới hạn quyền write vào phân vùng cài đặt Windows, đặc biệt mấy thư mục của hệ thống.
Thêm nữa từ Windows 10 trình chặn virus mặc định cấm write ở một số thư mục nào đó.
 
Các máy tính Windows hầu hết được cài đặt bởi "cài win dạo", user đều không phải Administrator nên bị giới hạn quyền write vào phân vùng cài đặt Windows, đặc biệt mấy thư mục của hệ thống.
Thêm nữa từ Windows 10 trình chặn virus mặc định cấm write ở một số thư mục nào đó.
Cũng có thể do quyền Admin, nhưng vấn đề là có cách nào qua mặt nó hay không? Những phần mềm khác người ta làm cách nào để ghi được dữ liệu mặc dù mình không chạy với quyền admin. Vấn đề ghi dữ liệu này đối với tôi không khó (chỉ cần ghi dữ liệu vào nơi khác là được) nhưng tui muốn tìm giải pháp nào tối ưu hơn để lưu dữ liệu vào chính thư mục cài đặt cho dễ quản lý.
Còn vụ chạy với quyền admin để mai thử lại (do mượn máy người khác để test), nhưng cái nửa hỏi rõ hơn để làm cho dễ, file của tui là xll, file add-ins của excel, vậy chạy Excel với quyền admin hay chạy xll bằng cách nào vậy @YêuCN
 
Cũng có thể do quyền Admin, nhưng vấn đề là có cách nào qua mặt nó hay không? Những phần mềm khác người ta làm cách nào để ghi được dữ liệu mặc dù mình không chạy với quyền admin. Vấn đề ghi dữ liệu này đối với tôi không khó (chỉ cần ghi dữ liệu vào nơi khác là được) nhưng tui muốn tìm giải pháp nào tối ưu hơn để lưu dữ liệu vào chính thư mục cài đặt cho dễ quản lý.
Còn vụ chạy với quyền admin để mai thử lại (do mượn máy người khác để test), nhưng cái nửa hỏi rõ hơn để làm cho dễ, file của tui là xll, file add-ins của excel, vậy chạy Excel với quyền admin hay chạy xll bằng cách nào vậy @YêuCN
Bạn chạy quyền admin với file excel.exe xong mở file xll là được! (đã thử)
 
Tôi nghĩ nên viết 1 cái exe chạy bằng quyền admin xong cho nó làm nhiệm vụ ghi file xml vào đó ! Trong xll gọi exe khi cần!
Đây cũng là một cách tham khảo, ban đầu tui định tạo thư mục trong Documents và ghi vào thư mục này. Để cân nhắc một trong hai cách làm này, cần sự tư vấn thêm nhiều cách nửa.
 
TỪ VB6 to Delphi nếu có các file đính kèm tôi toàn đính ngay trong DLL hay Exe khi cần load trực tiếp trong đó luôn không cần xuất ra HD

Còn trên C# tôi nghĩ cũng có chức năng đó Resource
 
Nhờ sự gợi ý của @HeSanbi@Nguyễn Duy Tuân em đã cấu hình được sản phẩm chạy ngon cành đào rồi, đúng là DPI giờ mình mới biết, trước giờ toàn lập trình ra sản phẩm đều bị lỗi size chữ như thế mà không biết cách sửa, hôm nay học được bài học lớn.
Sẳn đây cho hỏi thêm câu hỏi nửa (khỏi lập Topic mới), trong ứng dụng của tôi có lưu cấu hình vào File xml, ở máy mình chạy rất ngon nhưng sang máy khác (lúc này add-ins của mình cài vào đường dẫn C:\Program Files (x86)\VnTools Excel...) lưu vào file xml không được, toàn báo lỗi, mặc dù đọc dữ liệu từ file này bình thường. Thành viên nào biết nguyên nhân hướng dẫn mình khắc phục với. Cảm ơn các thành viên diễn này trước nhé.

Nếu bạn tạo bộ cài đặt bằng InnoSetup thì thêm Section [Dirs] vào và thiết lập quyền để ghi dữ liệu.
[Dirs]
;Nếu muốn ghi dữ liệu vào nơi Windows cho phép thì tạo thiết lập dưới đây:
Name: {commonappdata}\{app}; Permissions: users-modify
;Nếu muốn ghi dữ liệu vào thư mục ứng dụng thì tạo thiết lập dưới đây:
Name: {app}; Permissions: users-modify
 
Nếu bạn tạo bộ cài đặt bằng InnoSetup thì thêm Section [Dirs] vào và thiết lập quyền để ghi dữ liệu.
[Dirs]
;Nếu muốn ghi dữ liệu vào nơi Windows cho phép thì tạo thiết lập dưới đây:
Name: {commonappdata}\{app}; Permissions: users-modify
;Nếu muốn ghi dữ liệu vào thư mục ứng dụng thì tạo thiết lập dưới đây:
Name: {app}; Permissions: users-modify
Ngon cành đào luôn, giải pháp tối ưu đến thời điểm hiện tại.
 
Tôi có vấn đề mà chưa biết cách khắc phục, nhờ các thành viên ai có kinh nghiệm trợ giúp tôi với.
Tôi viết Add-Ins cho Excel bằng C#, ở máy tính của mình thì nó thể hiện đúng như mình thiết kế, nhưng sang máy khác thì kích thước chữ của các đối tượng (Label, checkbox, button...) trên WinForm đều thể hiện to hơn bình thường (to hơn mình thiết kế ở máy của mình). Vấn đề này tôi cũng từng gặp khi viết ứng dụng Windows nhưng đến thời điểm hiện tại vẫn chưa biết cách khắc phục, vậy có thành viên nào có kinh nghiệm về vấn đề này có thể hỗ trợ tôi khắc phục với, hoặc có gợi ý nào để tôi tham khảo với.
Dưới đây là một số ảnh kích thước chữ bị to dẫn đến trường hợp không thể hiện hết nội dung cần thể hiện.
View attachment 294105
View attachment 294106
View attachment 294107
ứng dung của bác đã chạy được chưa ạ
 
Đã chạy được và hơi bị ngon luôn.
Ngon tức là ứng dụng đã tối ưu mã phải không anh?
Khả năng bảo mật và khả năng bị tấn công ở mức nào? anh có viết mã theo chuẩn nguyên tắc của các tác giả nổi tiếng trong giới lập trình không?
Mã trong ứng dụng của anh có xử lý ở cấp độ memory khi cần thiết không?
Anh có tận dụng đa luồng vào thuật toán xử lý không?
Các hành động và thao tác với trang tính có bảo toàn Undo và Redo không?
Khả năng chiếm dụng tài nguyên như thế nào?
Khả năng tương thích đa nền tảng có không?
Xử lý lỗi khả năng xung đột giữa các tiến trình có không? Ví dụ như khi Application đang bận xử lý tác vụ, ứng dụng của anh có xếp hành động và tác vụ vào hàng đợi chờ thực thi không.
Ứng dụng của anh có tạo ra rác bộ nhớ không, và làm sạch chúng một cách tối ưu?
 
Lần chỉnh sửa cuối:
Ngon tức là ứng dụng đã tối ưu mã phải không anh?
Khả năng bảo mật và khả năng bị tấn công ở mức nào? anh có viết mã theo chuẩn nguyên tắc của các tác giả nổi tiếng trong giới lập trình không?
Mã trong ứng dụng của anh có xử lý ở cấp độ memory khi cần thiết không?
Anh có tận dụng đa luồng vào thuật toán xử lý không?
Các hành động và thao tác với trang tính có bảo toàn Undo và Redo không?
Khả năng chiếm dụng tài nguyên như thế nào?
Khả năng tương thích đa nền tảng có không?
Xử lý lỗi khả năng xung đột giữa các tiến trình có không? Ví dụ như khi Application đang bận xử lý tác vụ, ứng dụng của anh có xếp hành động và tác vụ vào hàng đợi chờ thực thi không.
Ứng dụng của anh có tạo ra rác bộ nhớ không, và làm sạch chúng một cách tối ưu?
Ở đây tui đang nói đến vấn đề thể hiện kích thước chữ trên WinForm chứ chưa nói đến cái Add-Ins. Nhờ có gợi ý của bác mà tui sẽ cân nhắc kỉ lại cái tiện ích. Mà xin nói thêm ở đây tui không phải dân lập trình được đào tạo bài bản mà đúng chất ở đây tui là dân a ma tơ nên vấn đề tìm hiểu sâu vào hệ thống thì tui xin thua, bác có kinh nghiệm có thể chia sẻ để tui học hỏi thêm, đặc biệt là cái vụ memory, đa luồng, khả năng chiếm dụng tài nguyên làm cách nào để biết, dùng cái gì để đo...
 
@giaiphap

Khi anh debug ứng dụng trong Visual Code Studio tất cả thông số trong quá trình chạy đều được ghi. Do là một Add-ins nên khi hoạt động cần đặt giới hạn bộ nhớ, và CPU. Khi ứng dụng tính toán. Nếu quá trình chiếm dụng xảy ra, khiến máy tính xảy ra tình trạng lag hoặc bị đứng. Người dùng có thể sẽ không biết nguyên nhân.

Một ví dụ điển hình là: Application.MultiThreadedCalculation.ThreadCount, Trong Excel anh có thể đặt số luồng tính toán, để giảm số luồng tính toán. Các luồng còn lại sẽ nhường cho các ứng dụng khác.
Quản lý cấp phát bộ nhớ để chống tràn, nếu máy tính có RAM 8GB, ứng dụng cần đặt giới hạn cấp phát bộ nhớ là 1/3. Và phần RAM còn lại để có đủ cho các ứng dụng khác.

Add-ins hoạt động trong Excel, giả sử Application đang bận tác vụ, khi tác tụ và hành động Add-ins diễn ra, quá trình xung đột có thể xảy ra và làm sập ứng dụng. Chính vì vậy cần đưa hành động và tác vụ vào hàng đợi để chờ đến khi Application có thể truy cập từ bên ngoài.

Nắm trong tay nguyên tắc lập trình, anh sẽ giảm đi nhiều lỗi nghiêm trọng mà lập trình viên thường mắc phải. Để quá trình chỉnh sửa mã, bảo trì mã dễ dàng.
 
Tôi thì chỉ thấy cái hình ở bài 1 quen quen mà thôi. Còn lại thì người dùng không phàn nàn là được. :p
 
Tôi thì chỉ thấy cái hình ở bài 1 quen quen mà thôi. Còn lại thì người dùng không phàn nàn là được. :p
Lỡ người dùng chả hiểu gì về cái WinForm để phàn nàn thì sao?
Thiếu giống gì mấy cái hàm "cho không" ở đây, có thể là "ngon" bậc nhất nhưng đọc chả hiểu gì hết, thêm cả mớ pointers rối như bòng bong. Ông nội tôi cũng không dám dùng. Tuy nhiên, vẫn có những người xâm mình tải về dùng.
 

Bài viết mới nhất

Back
Top Bottom